PluginProbe
Simple Analytics / trunk
Simple Analytics vtrunk
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 1.91 All 98 releases
simpleanalytics / tests / Browser / pluginSettings.spec.ts

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

308 lines 14.8 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 expect(await guest.content()).toContain('data-auto-collect="true"');
184 await guest.context().close();
185 });
186
187 test('adds a script with overwrite domain name', async ({ page, browser }) => {
188 await asAdmin(page);
189 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=advanced');
190 await page.fill('[name="simpleanalytics_hostname"]', 'example.com');
191 await saveSettings(page);
192 await expect(page.locator('[name="simpleanalytics_hostname"]')).toHaveValue('example.com');
193
194 const guest = await visitAsGuest(browser);
195 expect(await guest.content()).toContain('data-hostname="example.com"');
196 await guest.context().close();
197 });
198
199 test('adds a script with global variable name', async ({ page, browser }) => {
200 await asAdmin(page);
201 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=advanced');
202 await page.fill('[name="simpleanalytics_sa_global"]', 'ba_event');
203 await saveSettings(page);
204 await expect(page.locator('[name="simpleanalytics_sa_global"]')).toHaveValue('ba_event');
205
206 const guest = await visitAsGuest(browser);
207 expect(await guest.content()).toContain('data-sa-global="ba_event"');
208 await guest.context().close();
209 });
210
211 test('adds automated events script when collect automated events is enabled', async ({ page, browser }) => {
212 await asAdmin(page);
213 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=events');
214 await page.locator('[name="simpleanalytics_automated_events"]').check();
215 await saveSettings(page);
216 await expect(page.locator('[name="simpleanalytics_automated_events"]')).toBeChecked();
217
218 const guest = await visitAsGuest(browser);
219 await expect(guest.locator('script[src="https://scripts.simpleanalyticscdn.com/auto-events.js"]')).toBeAttached();
220 await guest.context().close();
221 });
222
223 test('adds automated events script with auto collect downloads', async ({ page, browser }) => {
224 await asAdmin(page);
225 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=events');
226 await page.locator('[name="simpleanalytics_automated_events"]').check();
227 await page.fill('[name="simpleanalytics_event_collect_downloads"]', 'outbound,emails,downloads');
228 await saveSettings(page);
229 await expect(page.locator('[name="simpleanalytics_automated_events"]')).toBeChecked();
230 await expect(page.locator('[name="simpleanalytics_event_collect_downloads"]')).toHaveValue('outbound,emails,downloads');
231
232 const guest = await visitAsGuest(browser);
233 expect(await guest.content()).toContain('data-collect="outbound,emails,downloads"');
234 await guest.context().close();
235 });
236
237 test('adds automated events script with download file extensions', async ({ page, browser }) => {
238 await asAdmin(page);
239 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=events');
240 await page.locator('[name="simpleanalytics_automated_events"]').check();
241 await page.fill('[name="simpleanalytics_event_extensions"]', 'pdf,zip');
242 await saveSettings(page);
243 await expect(page.locator('[name="simpleanalytics_automated_events"]')).toBeChecked();
244 await expect(page.locator('[name="simpleanalytics_event_extensions"]')).toHaveValue('pdf,zip');
245
246 const guest = await visitAsGuest(browser);
247 expect(await guest.content()).toContain('data-extensions="pdf,zip"');
248 await guest.context().close();
249 });
250
251 test('adds automated events script with use titles of page enabled', async ({ page, browser }) => {
252 await asAdmin(page);
253 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=events');
254 await page.locator('[name="simpleanalytics_automated_events"]').check();
255 await page.locator('[name="simpleanalytics_event_use_title"]').check();
256 await saveSettings(page);
257 await expect(page.locator('[name="simpleanalytics_automated_events"]')).toBeChecked();
258 await expect(page.locator('[name="simpleanalytics_event_use_title"]')).toBeChecked();
259
260 const guest = await visitAsGuest(browser);
261 expect(await guest.content()).toContain('data-use-title');
262 await guest.context().close();
263 });
264
265 test('adds automated events script with use full urls enabled', async ({ page, browser }) => {
266 await asAdmin(page);
267 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=events');
268 await page.locator('[name="simpleanalytics_automated_events"]').check();
269 await page.locator('[name="simpleanalytics_event_full_urls"]').check();
270 await saveSettings(page);
271 await expect(page.locator('[name="simpleanalytics_automated_events"]')).toBeChecked();
272 await expect(page.locator('[name="simpleanalytics_event_full_urls"]')).toBeChecked();
273
274 const guest = await visitAsGuest(browser);
275 expect(await guest.content()).toContain('data-full-urls');
276 await guest.context().close();
277 });
278
279 test('adds automated events script with override global', async ({ page, browser }) => {
280 await asAdmin(page);
281 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=events');
282 await page.locator('[name="simpleanalytics_automated_events"]').check();
283 await page.fill('[name="simpleanalytics_event_sa_global"]', 'ba_event');
284 await saveSettings(page);
285 await expect(page.locator('[name="simpleanalytics_automated_events"]')).toBeChecked();
286 await expect(page.locator('[name="simpleanalytics_event_sa_global"]')).toHaveValue('ba_event');
287
288 const guest = await visitAsGuest(browser);
289 expect(await guest.content()).toContain('data-sa-global="ba_event"');
290 await guest.context().close();
291 });
292
293 test('adds a script with a custom domain name', async ({ page, browser }) => {
294 await asAdmin(page);
295 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=advanced');
296 await page.fill('[name="simpleanalytics_custom_domain"]', 'mydomain.com');
297 await saveSettings(page);
298 await expect(page.locator('[name="simpleanalytics_custom_domain"]')).toHaveValue('mydomain.com');
299
300 const guest = await visitAsGuest(browser);
301 await expect(guest.locator('script[src="https://mydomain.com/latest.js"]')).toBeAttached();
302 await guest.context().close();
303
304 await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=advanced');
305 await page.fill('[name="simpleanalytics_custom_domain"]', '');
306 await saveSettings(page);
307 });
308