PluginProbe
Simple Analytics / 1.110
Simple Analytics v1.110
1.110 1.109 1.108 1.107 1.106 1.73 1.74 1.75 1.76 1.77 1.78 1.79 1.8 1.80 1.81 1.82 1.83 1.84 1.85 1.86 1.87 1.88 1.89 1.9 1.90 All 99 releases
simpleanalytics / tests / Browser / pluginSettings.spec.ts

pluginSettings.spec.ts in Simple Analytics 1.110, at tests/Browser/pluginSettings.spec.ts

347 lines 16.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import { test, expect, type Page, type Browser } from '@playwright/test';
2
3 const DEFAULT_SCRIPT_SELECTOR = 'script[src="https://scripts.simpleanalyticscdn.com/latest.js"]';
4 const INACTIVE_ADMIN_SCRIPT_SELECTOR = 'script[src*="resources/js/inactive.js"]';
5 const DASHBOARD_URL =
6 'https://dashboard.simpleanalytics.com/?utm_source=wordpress&utm_medium=plugin&utm_content=go_to_dashboard_button';
7 const SIGNUP_URL =
8 'https://www.simpleanalytics.com/signup?utm_source=wordpress&utm_medium=plugin&utm_content=signup_link';
9 const SCRIPT_PREFIX_COMMENT = '<!-- Simple Analytics - 100% privacy-first analytics (official WordPress plugin) -->';
10 const INACTIVE_COMMENT_PREFIX = '<!-- Simple Analytics: Script not included because this visitor is excluded by tracking rule:';
11 const INACTIVE_USER_ROLE_COMMENT = '<!-- Simple Analytics: Script not included because this visitor is excluded by tracking rule: Exclude User Role -->';
12 const INACTIVE_IP_COMMENT = '<!-- Simple Analytics: Script not included because this visitor is excluded by tracking rule: Exclude IP Address -->';
13
14 async function loginAs(page: Page, username: string, password: string) {
15 await page.goto('/wp-login.php');
16 // Use evaluate to set values + submit programmatically, bypassing Chrome autofill
17 await page.evaluate(([u, p]) => {
18 (document.getElementById('user_login') as HTMLInputElement).value = u;
19 (document.getElementById('user_pass') as HTMLInputElement).value = p;
20 (document.getElementById('loginform') as HTMLFormElement).submit();
21 }, [username, password]);
22 await page.waitForURL(/\/wp-admin/);
23 }
24
25 const asAdmin = (page: Page) => loginAs(page, 'admin', 'password');
26 const asAuthor = (page: Page) => loginAs(page, 'author', 'author');
27 const asEditor = (page: Page) => loginAs(page, 'editor', 'editor');
28
29 async function saveSettings(page: Page) {
30 await Promise.all([
31 page.waitForURL(/settings-updated/),
32 page.getByRole('button', { name: 'Save Changes' }).click(),
33 ]);
34 }
35
36 // Visit a URL in a fresh browser context (no cookies — anonymous visitor).
37 async function visitAsGuest(browser: Browser, path = '/'): Promise<Page> {
38 const ctx = await browser.newContext();
39 const page = await ctx.newPage();
40 await page.goto(path);
41 return page;
42 }
43
44 test('adds a script by default', async ({ page, browser }) => {
45 await asAdmin(page);
46 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=advanced');
47 await page.fill('[name="simpleanalytics_custom_domain"]', '');
48 await saveSettings(page);
49
50 const guest = await visitAsGuest(browser);
51 await expect(guest.locator(DEFAULT_SCRIPT_SELECTOR)).toBeAttached();
52 expect(await guest.content()).toContain('data-platform="wordpress"');
53 expect(await guest.content()).toContain(SCRIPT_PREFIX_COMMENT);
54 await guest.context().close();
55 });
56
57 test('shows guidance on general tab and keeps custom domain in advanced tab', async ({ page }) => {
58 await asAdmin(page);
59 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=general');
60
61 await expect(page.getByText('Simple Analytics is now added to your WordPress site.')).toBeVisible();
62 await expect(page.getByText('without cookies or personal data')).toBeVisible();
63 await expect(page.getByRole('link', { name: 'the Simple Analytics dashboard' })).toHaveAttribute('href', DASHBOARD_URL);
64 await expect(page.getByRole('link', { name: 'simpleanalytics.com.' })).toHaveAttribute('href', SIGNUP_URL);
65 await expect(page.getByRole('link', { name: 'Open dashboard', exact: true })).toHaveAttribute('href', DASHBOARD_URL);
66 await expect(page.getByRole('link', { name: 'Open Dashboard', exact: true })).toHaveAttribute('href', DASHBOARD_URL);
67 await expect(page.getByRole('button', { name: 'Save Changes' })).toHaveCount(0);
68 await expect(page.locator('[name="simpleanalytics_custom_domain"]')).toHaveCount(0);
69
70 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=advanced');
71 await expect(page.locator('[name="simpleanalytics_custom_domain"]')).toBeVisible();
72 });
73
74 test('adds inactive script for authenticated users by default', async ({ page }) => {
75 await asAdmin(page);
76 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=ignore-rules');
77 await page.locator('#simpleanalytics_exclude_user_roles-editor').uncheck();
78 await page.locator('#simpleanalytics_exclude_user_roles-author').uncheck();
79 await saveSettings(page);
80
81 await page.goto('/');
82 await expect(page.locator('#wpadminbar')).toBeAttached();
83 const inactiveScript = page.locator(INACTIVE_ADMIN_SCRIPT_SELECTOR);
84 if (await inactiveScript.count()) {
85 await expect(inactiveScript).toBeAttached();
86 expect(await page.content()).toContain(INACTIVE_COMMENT_PREFIX);
87 } else {
88 await expect(page.locator(DEFAULT_SCRIPT_SELECTOR)).toBeAttached();
89 }
90 });
91
92 test('adds a script with ignored pages', async ({ page, browser }) => {
93 await asAdmin(page);
94 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=ignore-rules');
95 await page.fill('[name="simpleanalytics_ignore_pages"]', '/vouchers');
96 await saveSettings(page);
97 await expect(page.locator('[name="simpleanalytics_ignore_pages"]')).toHaveValue('/vouchers');
98
99 const guest = await visitAsGuest(browser);
100 await guest.reload();
101 expect(await guest.content()).toContain('data-ignore-pages="/vouchers"');
102 await guest.context().close();
103 });
104
105 test('adds inactive script for selected user roles', async ({ page, browser }) => {
106 await asAdmin(page);
107 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=ignore-rules');
108 await page.locator('#simpleanalytics_exclude_user_roles-editor').check();
109 await page.locator('#simpleanalytics_exclude_user_roles-author').check();
110 await saveSettings(page);
111 await expect(page.locator('#simpleanalytics_exclude_user_roles-editor')).toBeChecked();
112 await expect(page.locator('#simpleanalytics_exclude_user_roles-author')).toBeChecked();
113
114 await page.goto('/');
115 await expect(page.locator(DEFAULT_SCRIPT_SELECTOR)).toBeAttached();
116
117 const authorCtx = await browser.newContext();
118 const authorPage = await authorCtx.newPage();
119 await asAuthor(authorPage);
120 await authorPage.goto('/');
121 await expect(authorPage.locator(INACTIVE_ADMIN_SCRIPT_SELECTOR)).toBeAttached();
122 expect(await authorPage.content()).toContain(INACTIVE_USER_ROLE_COMMENT);
123 await authorCtx.close();
124
125 const editorCtx = await browser.newContext();
126 const editorPage = await editorCtx.newPage();
127 await asEditor(editorPage);
128 await editorPage.goto('/');
129 await expect(editorPage.locator(INACTIVE_ADMIN_SCRIPT_SELECTOR)).toBeAttached();
130 expect(await editorPage.content()).toContain(INACTIVE_USER_ROLE_COMMENT);
131 await editorCtx.close();
132 });
133
134 test('adds inactive script for excluded IP addresses', async ({ page, browser }) => {
135 await asAdmin(page);
136 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=ignore-rules');
137 await page.getByRole('button', { name: /Add Current IP/ }).click();
138 await saveSettings(page);
139
140 const guest = await visitAsGuest(browser, '/');
141 await expect(guest.locator(INACTIVE_ADMIN_SCRIPT_SELECTOR)).toBeAttached();
142 expect(await guest.content()).toContain(INACTIVE_IP_COMMENT);
143 await guest.context().close();
144
145 // Reset excluded IPs so follow-up tests can assert active script behavior.
146 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=ignore-rules');
147 await page.fill('[name="simpleanalytics_excluded_ip_addresses"]', '');
148 await saveSettings(page);
149 });
150
151 test('adds a script with collect do not track enabled', async ({ page, browser }) => {
152 await asAdmin(page);
153 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=advanced');
154 await page.locator('[name="simpleanalytics_collect_dnt"]').check();
155 await saveSettings(page);
156 await expect(page.locator('[name="simpleanalytics_collect_dnt"]')).toBeChecked();
157
158 const guest = await visitAsGuest(browser);
159 expect(await guest.content()).toContain('data-collect-dnt="true"');
160 await guest.context().close();
161 });
162
163 test('adds a script with hash mode enabled', async ({ page, browser }) => {
164 await asAdmin(page);
165 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=advanced');
166 await page.locator('[name="simpleanalytics_hash_mode"]').check();
167 await saveSettings(page);
168 await expect(page.locator('[name="simpleanalytics_hash_mode"]')).toBeChecked();
169
170 const guest = await visitAsGuest(browser);
171 expect(await guest.content()).toContain('data-mode="hash"');
172 await guest.context().close();
173 });
174
175 test('adds a script with manually collect page views enabled', async ({ page, browser }) => {
176 await asAdmin(page);
177 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=advanced');
178 await page.locator('[name="simpleanalytics_manual_collect"]').check();
179 await saveSettings(page);
180 await expect(page.locator('[name="simpleanalytics_manual_collect"]')).toBeChecked();
181
182 const guest = await visitAsGuest(browser);
183 await expect(guest.locator(DEFAULT_SCRIPT_SELECTOR)).toHaveAttribute('data-auto-collect', 'false');
184 await guest.context().close();
185
186 await page.locator('[name="simpleanalytics_manual_collect"]').uncheck();
187 await saveSettings(page);
188 const automaticGuest = await visitAsGuest(browser);
189 await expect(automaticGuest.locator(DEFAULT_SCRIPT_SELECTOR)).not.toHaveAttribute('data-auto-collect');
190 await automaticGuest.context().close();
191 });
192
193 test('executes the saved onload callback when the analytics script loads', async ({ page, browser }) => {
194 await asAdmin(page);
195 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=advanced');
196 const callback = `document.documentElement.setAttribute('data-sa-callback', 'loaded "quoted"');`;
197 await page.locator('[name="simpleanalytics_onload_callback"]').fill(callback);
198 await saveSettings(page);
199
200 const context = await browser.newContext();
201 await context.route('https://scripts.simpleanalyticscdn.com/latest.js', route =>
202 route.fulfill({ contentType: 'application/javascript', body: '/* successful script load */' }));
203 const guest = await context.newPage();
204 try {
205 await guest.goto('/');
206 await expect(guest.locator('html')).toHaveAttribute('data-sa-callback', 'loaded "quoted"');
207 await expect(guest.locator(DEFAULT_SCRIPT_SELECTOR)).toHaveAttribute('onload', callback);
208 await expect(guest.locator(DEFAULT_SCRIPT_SELECTOR)).not.toHaveAttribute('data-onload');
209 } finally {
210 await page.locator('[name="simpleanalytics_onload_callback"]').fill('');
211 await saveSettings(page);
212 await context.close();
213 }
214 });
215
216 test('adds a script with overwrite domain name', async ({ page, browser }) => {
217 await asAdmin(page);
218 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=advanced');
219 await page.fill('[name="simpleanalytics_hostname"]', 'example.com');
220 await saveSettings(page);
221 await expect(page.locator('[name="simpleanalytics_hostname"]')).toHaveValue('example.com');
222
223 const guest = await visitAsGuest(browser);
224 expect(await guest.content()).toContain('data-hostname="example.com"');
225 await guest.context().close();
226 });
227
228 test('adds a script with global variable name', async ({ page, browser }) => {
229 await asAdmin(page);
230 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=advanced');
231 await page.fill('[name="simpleanalytics_sa_global"]', 'ba_event');
232 await saveSettings(page);
233 await expect(page.locator('[name="simpleanalytics_sa_global"]')).toHaveValue('ba_event');
234
235 const guest = await visitAsGuest(browser);
236 expect(await guest.content()).toContain('data-sa-global="ba_event"');
237 await guest.context().close();
238 });
239
240 test('adds automated events script when collect automated events is enabled', async ({ page, browser }) => {
241 await asAdmin(page);
242 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=events');
243 await page.locator('[name="simpleanalytics_automated_events"]').check();
244 await saveSettings(page);
245 await expect(page.locator('[name="simpleanalytics_automated_events"]')).toBeChecked();
246
247 const guest = await visitAsGuest(browser);
248 await expect(guest.locator('script[src="https://scripts.simpleanalyticscdn.com/auto-events.js"]')).toBeAttached();
249 await guest.context().close();
250 });
251
252 test('adds automated events script with auto collect downloads', async ({ page, browser }) => {
253 await asAdmin(page);
254 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=events');
255 await page.locator('[name="simpleanalytics_automated_events"]').check();
256 await page.fill('[name="simpleanalytics_event_collect_downloads"]', 'outbound,emails,downloads');
257 await saveSettings(page);
258 await expect(page.locator('[name="simpleanalytics_automated_events"]')).toBeChecked();
259 await expect(page.locator('[name="simpleanalytics_event_collect_downloads"]')).toHaveValue('outbound,emails,downloads');
260
261 const guest = await visitAsGuest(browser);
262 expect(await guest.content()).toContain('data-collect="outbound,emails,downloads"');
263 await guest.context().close();
264 });
265
266 test('adds automated events script with download file extensions', async ({ page, browser }) => {
267 await asAdmin(page);
268 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=events');
269 await page.locator('[name="simpleanalytics_automated_events"]').check();
270 await page.fill('[name="simpleanalytics_event_extensions"]', 'pdf,zip');
271 await saveSettings(page);
272 await expect(page.locator('[name="simpleanalytics_automated_events"]')).toBeChecked();
273 await expect(page.locator('[name="simpleanalytics_event_extensions"]')).toHaveValue('pdf,zip');
274
275 const guest = await visitAsGuest(browser);
276 expect(await guest.content()).toContain('data-extensions="pdf,zip"');
277 await guest.context().close();
278 });
279
280 test('adds automated events script with use titles of page enabled', async ({ page, browser }) => {
281 await asAdmin(page);
282 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=events');
283 await page.locator('[name="simpleanalytics_automated_events"]').check();
284 await page.locator('[name="simpleanalytics_event_use_title"]').check();
285 await saveSettings(page);
286 await expect(page.locator('[name="simpleanalytics_automated_events"]')).toBeChecked();
287 await expect(page.locator('[name="simpleanalytics_event_use_title"]')).toBeChecked();
288
289 const guest = await visitAsGuest(browser);
290 const eventsScript = guest.locator('script[src="https://scripts.simpleanalyticscdn.com/auto-events.js"]');
291 await expect(eventsScript).toHaveAttribute('data-use-title', 'true');
292 await page.locator('[name="simpleanalytics_event_use_title"]').uncheck();
293 await saveSettings(page);
294 await guest.reload();
295 await expect(eventsScript).toHaveAttribute('data-use-title', 'false');
296 await guest.context().close();
297 });
298
299 test('adds automated events script with use full urls enabled', async ({ page, browser }) => {
300 await asAdmin(page);
301 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=events');
302 await page.locator('[name="simpleanalytics_automated_events"]').check();
303 await page.locator('[name="simpleanalytics_event_full_urls"]').check();
304 await saveSettings(page);
305 await expect(page.locator('[name="simpleanalytics_automated_events"]')).toBeChecked();
306 await expect(page.locator('[name="simpleanalytics_event_full_urls"]')).toBeChecked();
307
308 const guest = await visitAsGuest(browser);
309 const eventsScript = guest.locator('script[src="https://scripts.simpleanalyticscdn.com/auto-events.js"]');
310 await expect(eventsScript).toHaveAttribute('data-full-urls', 'true');
311 await page.locator('[name="simpleanalytics_event_full_urls"]').uncheck();
312 await saveSettings(page);
313 await guest.reload();
314 await expect(eventsScript).toHaveAttribute('data-full-urls', 'false');
315 await guest.context().close();
316 });
317
318 test('adds automated events script with override global', async ({ page, browser }) => {
319 await asAdmin(page);
320 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=events');
321 await page.locator('[name="simpleanalytics_automated_events"]').check();
322 await page.fill('[name="simpleanalytics_event_sa_global"]', 'ba_event');
323 await saveSettings(page);
324 await expect(page.locator('[name="simpleanalytics_automated_events"]')).toBeChecked();
325 await expect(page.locator('[name="simpleanalytics_event_sa_global"]')).toHaveValue('ba_event');
326
327 const guest = await visitAsGuest(browser);
328 expect(await guest.content()).toContain('data-sa-global="ba_event"');
329 await guest.context().close();
330 });
331
332 test('adds a script with a custom domain name', async ({ page, browser }) => {
333 await asAdmin(page);
334 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=advanced');
335 await page.fill('[name="simpleanalytics_custom_domain"]', 'mydomain.com');
336 await saveSettings(page);
337 await expect(page.locator('[name="simpleanalytics_custom_domain"]')).toHaveValue('mydomain.com');
338
339 const guest = await visitAsGuest(browser);
340 await expect(guest.locator('script[src="https://mydomain.com/latest.js"]')).toBeAttached();
341 await guest.context().close();
342
343 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=advanced');
344 await page.fill('[name="simpleanalytics_custom_domain"]', '');
345 await saveSettings(page);
346 });
347