@prenta/admin 1.14.0 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/__tests__/lib/api.test.d.ts +2 -0
  3. package/dist/__tests__/lib/api.test.d.ts.map +1 -0
  4. package/dist/__tests__/lib/api.test.js +58 -0
  5. package/dist/__tests__/lib/api.test.js.map +1 -0
  6. package/dist/__tests__/lib/seo-service-autopilot.test.d.ts +2 -0
  7. package/dist/__tests__/lib/seo-service-autopilot.test.d.ts.map +1 -0
  8. package/dist/__tests__/lib/seo-service-autopilot.test.js +171 -0
  9. package/dist/__tests__/lib/seo-service-autopilot.test.js.map +1 -0
  10. package/dist/__tests__/lib/seo-service-proposals.test.js +28 -0
  11. package/dist/__tests__/lib/seo-service-proposals.test.js.map +1 -1
  12. package/dist/__tests__/views/redirects-pane.render.test.js +30 -12
  13. package/dist/__tests__/views/redirects-pane.render.test.js.map +1 -1
  14. package/dist/__tests__/views/seo-autopilot-applied.render.test.d.ts +2 -0
  15. package/dist/__tests__/views/seo-autopilot-applied.render.test.d.ts.map +1 -0
  16. package/dist/__tests__/views/seo-autopilot-applied.render.test.js +330 -0
  17. package/dist/__tests__/views/seo-autopilot-applied.render.test.js.map +1 -0
  18. package/dist/__tests__/views/seo-autopilot-card.render.test.d.ts +2 -0
  19. package/dist/__tests__/views/seo-autopilot-card.render.test.d.ts.map +1 -0
  20. package/dist/__tests__/views/seo-autopilot-card.render.test.js +512 -0
  21. package/dist/__tests__/views/seo-autopilot-card.render.test.js.map +1 -0
  22. package/dist/__tests__/views/seo-proposals-tab.render.test.js +139 -0
  23. package/dist/__tests__/views/seo-proposals-tab.render.test.js.map +1 -1
  24. package/dist/__tests__/views/seo-settings.render.test.js +41 -4
  25. package/dist/__tests__/views/seo-settings.render.test.js.map +1 -1
  26. package/dist/lib/api.d.ts +13 -2
  27. package/dist/lib/api.d.ts.map +1 -1
  28. package/dist/lib/api.js +1 -2
  29. package/dist/lib/api.js.map +1 -1
  30. package/dist/lib/seo-service.d.ts +206 -2
  31. package/dist/lib/seo-service.d.ts.map +1 -1
  32. package/dist/lib/seo-service.js +139 -5
  33. package/dist/lib/seo-service.js.map +1 -1
  34. package/dist/prenta-admin.css +1 -1
  35. package/dist/views/SEO.js +1 -1
  36. package/dist/views/SEO.js.map +1 -1
  37. package/dist/views/seo/AutopilotAppliedSection.d.ts +10 -0
  38. package/dist/views/seo/AutopilotAppliedSection.d.ts.map +1 -0
  39. package/dist/views/seo/AutopilotAppliedSection.js +295 -0
  40. package/dist/views/seo/AutopilotAppliedSection.js.map +1 -0
  41. package/dist/views/seo/ProposalsTab.d.ts.map +1 -1
  42. package/dist/views/seo/ProposalsTab.js +53 -17
  43. package/dist/views/seo/ProposalsTab.js.map +1 -1
  44. package/dist/views/seo/RedirectsTab.d.ts +3 -1
  45. package/dist/views/seo/RedirectsTab.d.ts.map +1 -1
  46. package/dist/views/seo/RedirectsTab.js +14 -19
  47. package/dist/views/seo/RedirectsTab.js.map +1 -1
  48. package/dist/views/seo/relative-age.d.ts +7 -0
  49. package/dist/views/seo/relative-age.d.ts.map +1 -0
  50. package/dist/views/seo/relative-age.js +20 -0
  51. package/dist/views/seo/relative-age.js.map +1 -0
  52. package/dist/views/settings/SeoAutopilotCard.d.ts +30 -0
  53. package/dist/views/settings/SeoAutopilotCard.d.ts.map +1 -0
  54. package/dist/views/settings/SeoAutopilotCard.js +375 -0
  55. package/dist/views/settings/SeoAutopilotCard.js.map +1 -0
  56. package/dist/views/settings/SeoSettingsTab.d.ts.map +1 -1
  57. package/dist/views/settings/SeoSettingsTab.js +2 -1
  58. package/dist/views/settings/SeoSettingsTab.js.map +1 -1
  59. package/dist/views/settings/components.d.ts +3 -1
  60. package/dist/views/settings/components.d.ts.map +1 -1
  61. package/dist/views/settings/components.js +2 -2
  62. package/dist/views/settings/components.js.map +1 -1
  63. package/package.json +3 -3
  64. package/src/__tests__/lib/api.test.ts +76 -0
  65. package/src/__tests__/lib/seo-service-autopilot.test.ts +196 -0
  66. package/src/__tests__/lib/seo-service-proposals.test.ts +29 -0
  67. package/src/__tests__/views/redirects-pane.render.test.tsx +36 -16
  68. package/src/__tests__/views/seo-autopilot-applied.render.test.tsx +382 -0
  69. package/src/__tests__/views/seo-autopilot-card.render.test.tsx +610 -0
  70. package/src/__tests__/views/seo-proposals-tab.render.test.tsx +161 -0
  71. package/src/__tests__/views/seo-settings.render.test.tsx +47 -7
  72. package/src/lib/api.ts +19 -3
  73. package/src/lib/seo-service.ts +334 -6
  74. package/src/views/SEO.tsx +1 -1
  75. package/src/views/seo/AutopilotAppliedSection.tsx +597 -0
  76. package/src/views/seo/ProposalsTab.tsx +92 -12
  77. package/src/views/seo/RedirectsTab.tsx +39 -60
  78. package/src/views/seo/relative-age.ts +15 -0
  79. package/src/views/settings/SeoAutopilotCard.tsx +826 -0
  80. package/src/views/settings/SeoSettingsTab.tsx +2 -0
  81. package/src/views/settings/components.tsx +10 -1
@@ -0,0 +1,512 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // @vitest-environment happy-dom
3
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
4
+ import { fireEvent, render, screen, waitFor, within } from '@testing-library/react';
5
+ const RUN_SUMMARY = {
6
+ startedAt: '2026-09-07T04:00:00Z',
7
+ durationMs: 1200,
8
+ applied: 2,
9
+ verifyFailed: 1,
10
+ reverted: 0,
11
+ gated: {},
12
+ applyOutcomes: {},
13
+ generated: { generated: 3, skipped: 0, failed: 0, haltedReason: null },
14
+ halted: false,
15
+ haltedReason: null,
16
+ };
17
+ const SETTINGS = {
18
+ enabled: false,
19
+ enabledById: null,
20
+ pausedAt: null,
21
+ pausedReason: null,
22
+ types: {},
23
+ pausedTypes: {},
24
+ minBrandAlignment: 85,
25
+ redirectMinConfidence: 85,
26
+ maxPerRun: 5,
27
+ maxPerDay: 20,
28
+ verifyFailuresPerRun: 2,
29
+ outcomeWatch: { enabled: true, days: 14, dropRatio: 0.4, minPriorClicks: 50 },
30
+ lastRunAt: null,
31
+ lastRun: null,
32
+ governance: { issueFixApprovalRequired: false, redirectApprovalRequired: false },
33
+ };
34
+ let current = { ...SETTINGS };
35
+ let putResponse = null;
36
+ let getResponse = null;
37
+ /** When set, PUT / run responses wait on these so a test can observe the in-flight state. */
38
+ let putGate = null;
39
+ let runGate = null;
40
+ function deferred() {
41
+ let resolve;
42
+ const promise = new Promise((r) => {
43
+ resolve = r;
44
+ });
45
+ return { promise, resolve };
46
+ }
47
+ const cmsApi = vi.fn(async (endpoint, options) => {
48
+ const method = options?.method ?? 'GET';
49
+ if (endpoint === '/seo/autopilot/settings' && method === 'GET') {
50
+ return getResponse ?? { data: current, status: 200 };
51
+ }
52
+ if (endpoint === '/seo/autopilot/settings' && method === 'PUT') {
53
+ if (putGate)
54
+ await putGate;
55
+ if (putResponse)
56
+ return putResponse;
57
+ const patch = JSON.parse(options?.body ?? '{}');
58
+ current = {
59
+ ...current,
60
+ ...patch,
61
+ types: { ...current.types, ...(patch.types ?? {}) },
62
+ outcomeWatch: { ...current.outcomeWatch, ...(patch.outcomeWatch ?? {}) },
63
+ pausedAt: patch.resume ? null : current.pausedAt,
64
+ pausedReason: patch.resume ? null : current.pausedReason,
65
+ };
66
+ return { data: current, status: 200 };
67
+ }
68
+ if (endpoint === '/seo/autopilot/run') {
69
+ if (runGate)
70
+ await runGate;
71
+ return { data: { ...RUN_SUMMARY, applied: 2, halted: false }, status: 200 };
72
+ }
73
+ return { data: {}, status: 200 };
74
+ });
75
+ vi.mock('../../lib/api.js', () => ({
76
+ cmsApi: (e, o) => cmsApi(e, o),
77
+ ensureCsrfToken: vi.fn(async () => { }),
78
+ }));
79
+ const toastSuccess = vi.fn();
80
+ const toastError = vi.fn();
81
+ const toastWarning = vi.fn();
82
+ const toastInfo = vi.fn();
83
+ vi.mock('sonner', () => ({
84
+ toast: {
85
+ success: (...a) => toastSuccess(...a),
86
+ error: (...a) => toastError(...a),
87
+ warning: (...a) => toastWarning(...a),
88
+ info: (...a) => toastInfo(...a),
89
+ promise: vi.fn(),
90
+ },
91
+ }));
92
+ const { SeoAutopilotCard, AUTOPILOT_TYPE_GROUPS } = await import('../../views/settings/SeoAutopilotCard.js');
93
+ const { SEO_AUTOPILOT_ISSUE_TYPES } = await import('../../lib/seo-service.js');
94
+ function putBodies() {
95
+ return cmsApi.mock.calls
96
+ .filter(([e, o]) => e === '/seo/autopilot/settings' && o?.method === 'PUT')
97
+ .map(([, o]) => JSON.parse(o?.body ?? '{}'));
98
+ }
99
+ beforeEach(() => {
100
+ current = { ...SETTINGS };
101
+ putResponse = null;
102
+ getResponse = null;
103
+ putGate = null;
104
+ runGate = null;
105
+ cmsApi.mockClear();
106
+ toastSuccess.mockClear();
107
+ toastError.mockClear();
108
+ toastWarning.mockClear();
109
+ toastInfo.mockClear();
110
+ });
111
+ describe('SeoAutopilotCard', () => {
112
+ it('renders the master toggle, type groups, thresholds, and a Never run status', async () => {
113
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
114
+ await screen.findByText('SEO Autopilot');
115
+ expect(screen.getByRole('switch', { name: /enable autopilot/i }).getAttribute('aria-checked')).toBe('false');
116
+ expect(screen.getByText('Titles')).toBeTruthy();
117
+ expect(screen.getByText('Redirects')).toBeTruthy();
118
+ expect(screen.getByLabelText(/minimum brand alignment/i).value).toBe('85');
119
+ expect(screen.getByText(/never run/i)).toBeTruthy();
120
+ // Nothing enabled and no veto → no governance warning, only the footnote.
121
+ expect(screen.queryByRole('region', { name: /governance/i })).toBeNull();
122
+ });
123
+ it('a blur-commit followed immediately by a checkbox click lands two PUTs, in order', async () => {
124
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
125
+ await screen.findByText('SEO Autopilot');
126
+ const brand = screen.getByLabelText(/minimum brand alignment/i);
127
+ const checkbox = screen.getByLabelText('Missing meta title');
128
+ fireEvent.change(brand, { target: { value: '90' } });
129
+ // mousedown on the checkbox blurs the input (commit → PUT #1) and the click
130
+ // follows in the same task; the form must still be enabled for it to land.
131
+ fireEvent.blur(brand);
132
+ expect(checkbox.disabled).toBe(false);
133
+ fireEvent.click(checkbox);
134
+ await waitFor(() => expect(putBodies()).toEqual([
135
+ { minBrandAlignment: 90 },
136
+ { types: { 'missing-meta-title': true } },
137
+ ]));
138
+ expect(toastInfo).not.toHaveBeenCalled();
139
+ await waitFor(() => expect(checkbox.checked).toBe(true));
140
+ expect(brand.value).toBe('90');
141
+ });
142
+ it('keeps focus on a toggled checkbox while its PUT is in flight and marks the card busy', async () => {
143
+ const gate = deferred();
144
+ putGate = gate.promise;
145
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
146
+ await screen.findByText('SEO Autopilot');
147
+ const card = screen.getByRole('region', { name: 'SEO Autopilot' });
148
+ const checkbox = screen.getByLabelText('Missing meta title');
149
+ checkbox.focus();
150
+ fireEvent.click(checkbox);
151
+ await waitFor(() => expect(card.getAttribute('aria-busy')).toBe('true'));
152
+ // Inputs stay enabled and focused; only the action buttons lock.
153
+ expect(checkbox.disabled).toBe(false);
154
+ expect(document.activeElement).toBe(checkbox);
155
+ expect(screen.getByRole('button', { name: /run now/i }).disabled).toBe(true);
156
+ gate.resolve();
157
+ await waitFor(() => expect(card.getAttribute('aria-busy')).toBeNull());
158
+ expect(checkbox.checked).toBe(true);
159
+ expect(document.activeElement).toBe(checkbox);
160
+ });
161
+ it('a save attempted while a manual run is in flight is not dropped silently', async () => {
162
+ const gate = deferred();
163
+ runGate = gate.promise;
164
+ current = { ...SETTINGS, enabled: true, enabledById: 'a' };
165
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
166
+ await screen.findByText('SEO Autopilot');
167
+ fireEvent.click(screen.getByRole('button', { name: /run now/i }));
168
+ await waitFor(() => expect(cmsApi).toHaveBeenCalledWith('/seo/autopilot/run', expect.anything()));
169
+ fireEvent.click(screen.getByLabelText('Missing meta title'));
170
+ await waitFor(() => expect(toastInfo).toHaveBeenCalledTimes(1));
171
+ expect(String(toastInfo.mock.calls[0]?.[0])).toMatch(/still running/i);
172
+ expect(putBodies()).toEqual([]);
173
+ gate.resolve();
174
+ await waitFor(() => expect(toastSuccess).toHaveBeenCalled());
175
+ });
176
+ it('toggling a type PUTs a types patch', async () => {
177
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
178
+ await screen.findByText('SEO Autopilot');
179
+ fireEvent.click(screen.getByLabelText('Missing meta title'));
180
+ await waitFor(() => expect(cmsApi).toHaveBeenCalledWith('/seo/autopilot/settings', expect.objectContaining({
181
+ method: 'PUT',
182
+ body: JSON.stringify({ types: { 'missing-meta-title': true } }),
183
+ })));
184
+ expect(toastSuccess).toHaveBeenCalled();
185
+ await waitFor(() => expect(screen.getByLabelText('Missing meta title').checked).toBe(true));
186
+ });
187
+ it('toggling the master switch PUTs { enabled }', async () => {
188
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
189
+ await screen.findByText('SEO Autopilot');
190
+ fireEvent.click(screen.getByRole('switch', { name: /enable autopilot/i }));
191
+ await waitFor(() => expect(putBodies()).toEqual([{ enabled: true }]));
192
+ await waitFor(() => expect(screen.getByRole('switch', { name: /enable autopilot/i }).getAttribute('aria-checked')).toBe('true'));
193
+ });
194
+ it('commits a clamped threshold on blur and sends the outcome-watch ratio as a fraction', async () => {
195
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
196
+ await screen.findByText('SEO Autopilot');
197
+ const brand = screen.getByLabelText(/minimum brand alignment/i);
198
+ fireEvent.change(brand, { target: { value: '140' } });
199
+ fireEvent.blur(brand);
200
+ await waitFor(() => expect(putBodies()).toEqual([{ minBrandAlignment: 100 }]));
201
+ const drop = screen.getByLabelText(/regression threshold/i);
202
+ fireEvent.change(drop, { target: { value: '25' } });
203
+ fireEvent.blur(drop);
204
+ await waitFor(() => expect(putBodies()[1]).toEqual({ outcomeWatch: { dropRatio: 0.25 } }));
205
+ });
206
+ it('does not PUT when a number field is blurred unchanged or with garbage', async () => {
207
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
208
+ await screen.findByText('SEO Autopilot');
209
+ const perRun = screen.getByLabelText(/max changes per run/i);
210
+ fireEvent.blur(perRun);
211
+ fireEvent.change(perRun, { target: { value: '' } });
212
+ fireEvent.blur(perRun);
213
+ expect(putBodies()).toEqual([]);
214
+ expect(perRun.value).toBe('5');
215
+ });
216
+ it('surfaces a PUT validation error verbatim and keeps the previous state', async () => {
217
+ putResponse = { error: 'maxPerRun must be an integer between 1 and 25', status: 400 };
218
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
219
+ await screen.findByText('SEO Autopilot');
220
+ fireEvent.click(screen.getByLabelText('Missing meta title'));
221
+ await waitFor(() => expect(toastError).toHaveBeenCalledWith('maxPerRun must be an integer between 1 and 25'));
222
+ expect(toastSuccess).not.toHaveBeenCalled();
223
+ expect(screen.getByLabelText('Missing meta title').checked).toBe(false);
224
+ });
225
+ it('resets a number field to the last saved value when its PUT fails', async () => {
226
+ putResponse = { error: 'maxPerRun must be an integer between 1 and 25', status: 400 };
227
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
228
+ await screen.findByText('SEO Autopilot');
229
+ const perRun = screen.getByLabelText(/max changes per run/i);
230
+ fireEvent.change(perRun, { target: { value: '9' } });
231
+ fireEvent.blur(perRun);
232
+ await waitFor(() => expect(toastError).toHaveBeenCalledWith('maxPerRun must be an integer between 1 and 25'));
233
+ await waitFor(() => expect(perRun.value).toBe('5'));
234
+ expect(putBodies()).toEqual([{ maxPerRun: 9 }]);
235
+ });
236
+ it('shows the paused notice with Resume when pausedAt is set, and resumes', async () => {
237
+ current = {
238
+ ...SETTINGS,
239
+ enabled: true,
240
+ pausedAt: '2026-01-01T00:00:00Z',
241
+ pausedReason: 'owner_unavailable',
242
+ };
243
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
244
+ const resume = await screen.findByRole('button', { name: /^resume$/i });
245
+ const notice = screen.getByRole('region', { name: /autopilot is paused/i });
246
+ // Static per load: no live region, but the auto-resume behaviour is spelled out.
247
+ expect(notice.getAttribute('role')).not.toBe('status');
248
+ expect(notice.textContent ?? '').toMatch(/saving any setting resumes autopilot with you as the author of record/i);
249
+ fireEvent.click(resume);
250
+ await waitFor(() => expect(cmsApi).toHaveBeenCalledWith('/seo/autopilot/settings', expect.objectContaining({ method: 'PUT', body: JSON.stringify({ resume: true }) })));
251
+ await waitFor(() => expect(screen.queryByRole('region', { name: /autopilot is paused/i })).toBeNull());
252
+ expect(toastSuccess).toHaveBeenCalledWith('Autopilot resumed');
253
+ });
254
+ it('any save while paused for owner_unavailable also resumes (the save repairs the owner)', async () => {
255
+ current = {
256
+ ...SETTINGS,
257
+ enabled: true,
258
+ pausedAt: '2026-01-01T00:00:00Z',
259
+ pausedReason: 'owner_unavailable',
260
+ };
261
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
262
+ await screen.findByRole('button', { name: /^resume$/i });
263
+ fireEvent.click(screen.getByLabelText('Missing meta title'));
264
+ await waitFor(() => expect(putBodies()).toEqual([{ types: { 'missing-meta-title': true }, resume: true }]));
265
+ // The implicit resume is visible in the toast.
266
+ await waitFor(() => expect(toastSuccess).toHaveBeenCalledWith('Missing meta title enabled — autopilot resumed'));
267
+ });
268
+ it('turning autopilot off while paused for owner_unavailable does not inject resume', async () => {
269
+ current = {
270
+ ...SETTINGS,
271
+ enabled: true,
272
+ pausedAt: '2026-01-01T00:00:00Z',
273
+ pausedReason: 'owner_unavailable',
274
+ };
275
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
276
+ await screen.findByRole('button', { name: /^resume$/i });
277
+ fireEvent.click(screen.getByRole('switch', { name: /enable autopilot/i }));
278
+ await waitFor(() => expect(putBodies()).toEqual([{ enabled: false }]));
279
+ await waitFor(() => expect(toastSuccess).toHaveBeenCalledWith('Autopilot disabled'));
280
+ expect(toastSuccess).not.toHaveBeenCalledWith(expect.stringMatching(/resumed/i));
281
+ });
282
+ it('a save while paused for another reason does not resume', async () => {
283
+ current = {
284
+ ...SETTINGS,
285
+ enabled: true,
286
+ pausedAt: '2026-01-01T00:00:00Z',
287
+ pausedReason: 'outcome_regression',
288
+ };
289
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
290
+ await screen.findByRole('button', { name: /^resume$/i });
291
+ fireEvent.click(screen.getByLabelText('Missing meta title'));
292
+ await waitFor(() => expect(putBodies()).toEqual([{ types: { 'missing-meta-title': true } }]));
293
+ // Still paused: the notice and Resume remain, and no auto-resume is claimed.
294
+ const notice = screen.getByRole('region', { name: /autopilot is paused/i });
295
+ expect(notice.textContent ?? '').not.toMatch(/saving any setting resumes/i);
296
+ await waitFor(() => expect(toastSuccess).toHaveBeenCalledWith('Missing meta title enabled'));
297
+ });
298
+ it('lists paused fix types with the server reason verbatim and a per-type Resume that sends resumeTypes', async () => {
299
+ // The server stores a free-form sentence per paused type (autopilot-outcome.ts).
300
+ const reason = 'Paused 2026-09-08: /pricing lost 55% clicks after an autopilot change';
301
+ current = {
302
+ ...SETTINGS,
303
+ enabled: true,
304
+ types: { 'missing-meta-title': true },
305
+ pausedTypes: { 'missing-meta-title': reason },
306
+ };
307
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
308
+ await screen.findByText('SEO Autopilot');
309
+ const list = screen.getByRole('list', { name: /paused fix types/i });
310
+ expect(list.textContent ?? '').toContain(`Missing meta title — ${reason}`);
311
+ fireEvent.click(within(list).getByRole('button', { name: /resume/i }));
312
+ await waitFor(() => expect(putBodies()).toEqual([{ resumeTypes: ['missing-meta-title'] }]));
313
+ });
314
+ it('Run now is disabled while the policy is disabled and explains why', async () => {
315
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
316
+ await screen.findByText('SEO Autopilot');
317
+ const run = screen.getByRole('button', { name: /run now/i });
318
+ expect(run.disabled).toBe(true);
319
+ expect(run.getAttribute('title')).toMatch(/enable autopilot to run it now/i);
320
+ const hintId = run.getAttribute('aria-describedby');
321
+ expect(hintId).toBeTruthy();
322
+ expect(document.getElementById(hintId)?.textContent ?? '').toMatch(/enable autopilot to run it now/i);
323
+ expect(cmsApi).not.toHaveBeenCalledWith('/seo/autopilot/run', expect.anything());
324
+ });
325
+ it('Run now explains the pause when the policy is enabled but paused', async () => {
326
+ current = {
327
+ ...SETTINGS,
328
+ enabled: true,
329
+ pausedAt: '2026-01-01T00:00:00Z',
330
+ pausedReason: 'manual',
331
+ };
332
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
333
+ await screen.findByText('SEO Autopilot');
334
+ const run = screen.getByRole('button', { name: /run now/i });
335
+ expect(run.disabled).toBe(true);
336
+ expect(run.getAttribute('title')).toMatch(/resume autopilot to run it now/i);
337
+ const hintId = run.getAttribute('aria-describedby');
338
+ expect(document.getElementById(hintId)?.textContent ?? '').toMatch(/resume autopilot to run it now/i);
339
+ });
340
+ it('Run now carries no hint once it is runnable', async () => {
341
+ current = { ...SETTINGS, enabled: true, enabledById: 'a' };
342
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
343
+ await screen.findByText('SEO Autopilot');
344
+ const run = screen.getByRole('button', { name: /run now/i });
345
+ expect(run.disabled).toBe(false);
346
+ expect(run.getAttribute('title')).toBeNull();
347
+ expect(run.getAttribute('aria-describedby')).toBeNull();
348
+ });
349
+ it('Run now POSTs /seo/autopilot/run and reloads', async () => {
350
+ current = { ...SETTINGS, enabled: true, enabledById: 'a' };
351
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
352
+ await screen.findByText('SEO Autopilot');
353
+ const run = screen.getByRole('button', { name: /run now/i });
354
+ expect(run.disabled).toBe(false);
355
+ fireEvent.click(run);
356
+ // Second click while in flight must not queue a second run.
357
+ fireEvent.click(run);
358
+ await waitFor(() => expect(cmsApi).toHaveBeenCalledWith('/seo/autopilot/run', expect.objectContaining({ method: 'POST' })));
359
+ await waitFor(() => expect(toastSuccess).toHaveBeenCalled());
360
+ expect(cmsApi.mock.calls.filter(([e]) => e === '/seo/autopilot/run')).toHaveLength(1);
361
+ // Settings are re-read after the run.
362
+ expect(cmsApi.mock.calls.filter(([e, o]) => e === '/seo/autopilot/settings' && (o?.method ?? 'GET') === 'GET').length).toBeGreaterThanOrEqual(2);
363
+ });
364
+ it('summarises the last run and renders already_running as neutral text', async () => {
365
+ current = {
366
+ ...SETTINGS,
367
+ enabled: true,
368
+ lastRunAt: new Date(Date.now() - 3 * 3_600_000).toISOString(),
369
+ lastRun: {
370
+ ...RUN_SUMMARY,
371
+ applied: 4,
372
+ verifyFailed: 1,
373
+ reverted: 2,
374
+ halted: true,
375
+ haltedReason: 'already_running',
376
+ },
377
+ };
378
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
379
+ await screen.findByText('SEO Autopilot');
380
+ const summary = screen.getByRole('status', { name: /last run/i });
381
+ expect(summary.textContent ?? '').toMatch(/4 applied/);
382
+ expect(summary.textContent ?? '').toMatch(/1 verify-failed/);
383
+ expect(summary.textContent ?? '').toMatch(/2 reverted/);
384
+ const halted = screen.getByRole('status', { name: /run stopped/i });
385
+ expect(halted.textContent ?? '').toMatch(/a run was already in progress/i);
386
+ expect(halted.className).not.toContain('text-warning');
387
+ });
388
+ it('renders other halt reasons as warnings', async () => {
389
+ current = {
390
+ ...SETTINGS,
391
+ enabled: true,
392
+ lastRunAt: '2026-09-01T04:00:00Z',
393
+ lastRun: { ...RUN_SUMMARY, halted: true, haltedReason: 'verify_failures' },
394
+ };
395
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
396
+ await screen.findByText('SEO Autopilot');
397
+ const halted = screen.getByRole('status', { name: /run stopped/i });
398
+ expect(halted.textContent ?? '').toMatch(/verification failures/i);
399
+ expect(halted.className).toContain('text-warning');
400
+ });
401
+ it('describes budget_exhausted as the time budget, not the daily cap', async () => {
402
+ // Core halts with `budget_exhausted` when the tick's wall-clock budget runs
403
+ // out; the daily cap is a gate reason that never halts the run.
404
+ current = {
405
+ ...SETTINGS,
406
+ enabled: true,
407
+ lastRunAt: '2026-09-01T04:00:00Z',
408
+ lastRun: { ...RUN_SUMMARY, halted: true, haltedReason: 'budget_exhausted' },
409
+ };
410
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
411
+ await screen.findByText('SEO Autopilot');
412
+ const halted = screen.getByRole('status', { name: /run stopped/i });
413
+ expect(halted.textContent ?? '').toMatch(/ran out of time/i);
414
+ expect(halted.textContent ?? '').not.toMatch(/daily/i);
415
+ });
416
+ it.each([
417
+ ['apply_failed', /applying a change failed/i],
418
+ ['run_failed', /unexpected error/i],
419
+ ])('renders the coded %s halt without echoing it as a raw error', async (reason, copy) => {
420
+ // Core stores coded reasons instead of raw error messages; the card must
421
+ // have copy for each so it never falls back to "stopped with an error: …".
422
+ current = {
423
+ ...SETTINGS,
424
+ enabled: true,
425
+ lastRunAt: '2026-09-01T04:00:00Z',
426
+ lastRun: { ...RUN_SUMMARY, halted: true, haltedReason: reason },
427
+ };
428
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
429
+ await screen.findByText('SEO Autopilot');
430
+ const halted = screen.getByRole('status', { name: /run stopped/i });
431
+ expect(halted.textContent ?? '').toMatch(copy);
432
+ expect(halted.textContent ?? '').not.toMatch(/stopped with an error/i);
433
+ expect(halted.className).toContain('text-warning');
434
+ });
435
+ it('renders a recent last run as a relative age and an old one as a day count', async () => {
436
+ current = {
437
+ ...SETTINGS,
438
+ enabled: true,
439
+ lastRunAt: new Date(Date.now() - 5 * 60_000).toISOString(),
440
+ };
441
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
442
+ await screen.findByText('SEO Autopilot');
443
+ expect(screen.getByRole('status', { name: /last run/i }).textContent ?? '').toMatch(/last run 5m ago/i);
444
+ });
445
+ it('offers every autopilot issue type exactly once (mirror of SEO_AUTOPILOT_ISSUE_TYPES)', () => {
446
+ const ids = AUTOPILOT_TYPE_GROUPS.flatMap((g) => g.options.map((o) => o.id));
447
+ expect(new Set(ids).size).toBe(ids.length);
448
+ expect([...ids].sort()).toEqual([...SEO_AUTOPILOT_ISSUE_TYPES].sort());
449
+ });
450
+ it('read-only for non-admins', async () => {
451
+ current = { ...SETTINGS, enabled: true, enabledById: 'a' };
452
+ render(_jsx(SeoAutopilotCard, { canEdit: false, onNavigate: () => { } }));
453
+ await screen.findByText('SEO Autopilot');
454
+ expect(screen.getByRole('switch', { name: /enable autopilot/i }).disabled).toBe(true);
455
+ expect(screen.getByLabelText('Missing meta title').disabled).toBe(true);
456
+ expect(screen.getByLabelText(/minimum brand alignment/i).disabled).toBe(true);
457
+ expect(screen.getByRole('button', { name: /run now/i }).disabled).toBe(true);
458
+ });
459
+ it('warns when an enabled type is vetoed by AI governance (approvalRequired)', async () => {
460
+ current = {
461
+ ...SETTINGS,
462
+ enabled: true,
463
+ types: { 'missing-meta-title': true },
464
+ governance: { issueFixApprovalRequired: true, redirectApprovalRequired: false },
465
+ };
466
+ const onNavigate = vi.fn();
467
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: onNavigate }));
468
+ await screen.findByText('SEO Autopilot');
469
+ const notice = screen.getByRole('region', { name: /governance/i });
470
+ expect(notice.getAttribute('role')).not.toBe('status');
471
+ expect(notice.textContent ?? '').toMatch(/requires approval/i);
472
+ fireEvent.click(within(notice).getByRole('button', { name: /settings → ai/i }));
473
+ expect(onNavigate).toHaveBeenCalledWith('/settings?tab=ai');
474
+ });
475
+ it('does not warn when no enabled type is vetoed', async () => {
476
+ current = {
477
+ ...SETTINGS,
478
+ enabled: true,
479
+ types: { redirect: true },
480
+ governance: { issueFixApprovalRequired: true, redirectApprovalRequired: false },
481
+ };
482
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
483
+ await screen.findByText('SEO Autopilot');
484
+ expect(screen.queryByRole('region', { name: /governance/i })).toBeNull();
485
+ });
486
+ it('keeps live regions to the last-run lines only', async () => {
487
+ current = {
488
+ ...SETTINGS,
489
+ enabled: true,
490
+ types: { 'missing-meta-title': true },
491
+ pausedAt: '2026-01-01T00:00:00Z',
492
+ pausedReason: 'manual',
493
+ lastRunAt: '2026-09-01T04:00:00Z',
494
+ lastRun: { ...RUN_SUMMARY, halted: true, haltedReason: 'verify_failures' },
495
+ governance: { issueFixApprovalRequired: true, redirectApprovalRequired: false },
496
+ };
497
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
498
+ await screen.findByText('SEO Autopilot');
499
+ const live = screen.getAllByRole('status').map((el) => el.getAttribute('aria-label'));
500
+ expect(live.sort()).toEqual(['Last run', 'Run stopped']);
501
+ });
502
+ it('shows an error state with Retry when settings fail to load', async () => {
503
+ getResponse = { error: 'Request failed (500)', status: 500 };
504
+ render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
505
+ const retry = await screen.findByRole('button', { name: /retry/i });
506
+ expect(screen.getByRole('alert').textContent ?? '').toMatch(/autopilot settings/i);
507
+ getResponse = null;
508
+ fireEvent.click(retry);
509
+ await screen.findByRole('switch', { name: /enable autopilot/i });
510
+ });
511
+ });
512
+ //# sourceMappingURL=seo-autopilot-card.render.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-autopilot-card.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/seo-autopilot-card.render.test.tsx"],"names":[],"mappings":"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"}