@prenta/admin 1.13.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.
- package/CHANGELOG.md +31 -0
- package/dist/__tests__/lib/api.test.d.ts +2 -0
- package/dist/__tests__/lib/api.test.d.ts.map +1 -0
- package/dist/__tests__/lib/api.test.js +58 -0
- package/dist/__tests__/lib/api.test.js.map +1 -0
- package/dist/__tests__/lib/seo-service-autopilot.test.d.ts +2 -0
- package/dist/__tests__/lib/seo-service-autopilot.test.d.ts.map +1 -0
- package/dist/__tests__/lib/seo-service-autopilot.test.js +171 -0
- package/dist/__tests__/lib/seo-service-autopilot.test.js.map +1 -0
- package/dist/__tests__/lib/seo-service-proposals.test.d.ts +2 -0
- package/dist/__tests__/lib/seo-service-proposals.test.d.ts.map +1 -0
- package/dist/__tests__/lib/seo-service-proposals.test.js +99 -0
- package/dist/__tests__/lib/seo-service-proposals.test.js.map +1 -0
- package/dist/__tests__/router/seo-tab-for-path.test.js +1 -0
- package/dist/__tests__/router/seo-tab-for-path.test.js.map +1 -1
- package/dist/__tests__/views/redirects-pane.render.test.js +30 -12
- package/dist/__tests__/views/redirects-pane.render.test.js.map +1 -1
- package/dist/__tests__/views/seo-autopilot-applied.render.test.d.ts +2 -0
- package/dist/__tests__/views/seo-autopilot-applied.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/seo-autopilot-applied.render.test.js +330 -0
- package/dist/__tests__/views/seo-autopilot-applied.render.test.js.map +1 -0
- package/dist/__tests__/views/seo-autopilot-card.render.test.d.ts +2 -0
- package/dist/__tests__/views/seo-autopilot-card.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/seo-autopilot-card.render.test.js +512 -0
- package/dist/__tests__/views/seo-autopilot-card.render.test.js.map +1 -0
- package/dist/__tests__/views/seo-proposals-tab.render.test.d.ts +2 -0
- package/dist/__tests__/views/seo-proposals-tab.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/seo-proposals-tab.render.test.js +431 -0
- package/dist/__tests__/views/seo-proposals-tab.render.test.js.map +1 -0
- package/dist/__tests__/views/seo-settings.render.test.js +41 -4
- package/dist/__tests__/views/seo-settings.render.test.js.map +1 -1
- package/dist/components/seo/ChangePreview.d.ts +6 -0
- package/dist/components/seo/ChangePreview.d.ts.map +1 -0
- package/dist/components/seo/ChangePreview.js +18 -0
- package/dist/components/seo/ChangePreview.js.map +1 -0
- package/dist/components/seo/SeoIssueFixPanel.d.ts.map +1 -1
- package/dist/components/seo/SeoIssueFixPanel.js +1 -14
- package/dist/components/seo/SeoIssueFixPanel.js.map +1 -1
- package/dist/lib/api.d.ts +13 -2
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +1 -2
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/seo-service.d.ts +293 -2
- package/dist/lib/seo-service.d.ts.map +1 -1
- package/dist/lib/seo-service.js +170 -0
- package/dist/lib/seo-service.js.map +1 -1
- package/dist/prenta-admin.css +1 -1
- package/dist/views/SEO.d.ts +5 -1
- package/dist/views/SEO.d.ts.map +1 -1
- package/dist/views/SEO.js +28 -9
- package/dist/views/SEO.js.map +1 -1
- package/dist/views/seo/AutopilotAppliedSection.d.ts +10 -0
- package/dist/views/seo/AutopilotAppliedSection.d.ts.map +1 -0
- package/dist/views/seo/AutopilotAppliedSection.js +295 -0
- package/dist/views/seo/AutopilotAppliedSection.js.map +1 -0
- package/dist/views/seo/ProposalsTab.d.ts +7 -0
- package/dist/views/seo/ProposalsTab.d.ts.map +1 -0
- package/dist/views/seo/ProposalsTab.js +334 -0
- package/dist/views/seo/ProposalsTab.js.map +1 -0
- package/dist/views/seo/RedirectsTab.d.ts +3 -1
- package/dist/views/seo/RedirectsTab.d.ts.map +1 -1
- package/dist/views/seo/RedirectsTab.js +14 -19
- package/dist/views/seo/RedirectsTab.js.map +1 -1
- package/dist/views/seo/relative-age.d.ts +7 -0
- package/dist/views/seo/relative-age.d.ts.map +1 -0
- package/dist/views/seo/relative-age.js +20 -0
- package/dist/views/seo/relative-age.js.map +1 -0
- package/dist/views/settings/SeoAutopilotCard.d.ts +30 -0
- package/dist/views/settings/SeoAutopilotCard.d.ts.map +1 -0
- package/dist/views/settings/SeoAutopilotCard.js +375 -0
- package/dist/views/settings/SeoAutopilotCard.js.map +1 -0
- package/dist/views/settings/SeoSettingsTab.d.ts.map +1 -1
- package/dist/views/settings/SeoSettingsTab.js +2 -1
- package/dist/views/settings/SeoSettingsTab.js.map +1 -1
- package/dist/views/settings/components.d.ts +3 -1
- package/dist/views/settings/components.d.ts.map +1 -1
- package/dist/views/settings/components.js +2 -2
- package/dist/views/settings/components.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/lib/api.test.ts +76 -0
- package/src/__tests__/lib/seo-service-autopilot.test.ts +196 -0
- package/src/__tests__/lib/seo-service-proposals.test.ts +108 -0
- package/src/__tests__/router/seo-tab-for-path.test.ts +1 -0
- package/src/__tests__/views/redirects-pane.render.test.tsx +36 -16
- package/src/__tests__/views/seo-autopilot-applied.render.test.tsx +382 -0
- package/src/__tests__/views/seo-autopilot-card.render.test.tsx +610 -0
- package/src/__tests__/views/seo-proposals-tab.render.test.tsx +531 -0
- package/src/__tests__/views/seo-settings.render.test.tsx +47 -7
- package/src/components/seo/ChangePreview.tsx +47 -0
- package/src/components/seo/SeoIssueFixPanel.tsx +1 -44
- package/src/lib/api.ts +19 -3
- package/src/lib/seo-service.ts +455 -2
- package/src/views/SEO.tsx +41 -8
- package/src/views/seo/AutopilotAppliedSection.tsx +597 -0
- package/src/views/seo/ProposalsTab.tsx +761 -0
- package/src/views/seo/RedirectsTab.tsx +39 -60
- package/src/views/seo/relative-age.ts +15 -0
- package/src/views/settings/SeoAutopilotCard.tsx +826 -0
- package/src/views/settings/SeoSettingsTab.tsx +2 -0
- package/src/views/settings/components.tsx +10 -1
|
@@ -0,0 +1,330 @@
|
|
|
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 { act, fireEvent, render, screen, waitFor, within } from '@testing-library/react';
|
|
5
|
+
/**
|
|
6
|
+
* SEO → Proposals "Applied by autopilot" ledger (spec §4 / §6). Pins: rows
|
|
7
|
+
* render entity → change → gate → outcome, Revert is admin-only and confirmed,
|
|
8
|
+
* a 409 conflict re-prompts with the field list and a forced retry, and one
|
|
9
|
+
* mutation is allowed in flight at a time.
|
|
10
|
+
*/
|
|
11
|
+
function row(over = {}) {
|
|
12
|
+
return {
|
|
13
|
+
id: 'la-1',
|
|
14
|
+
kind: 'issue-fix',
|
|
15
|
+
issueType: 'missing-meta-title',
|
|
16
|
+
entityId: 'doc-1',
|
|
17
|
+
collection: 'pages',
|
|
18
|
+
entityTitle: 'Pricing',
|
|
19
|
+
entityUrl: '/pricing',
|
|
20
|
+
path: '/pricing',
|
|
21
|
+
before: { metaTitle: null },
|
|
22
|
+
after: { metaTitle: 'Pricing for growing teams' },
|
|
23
|
+
gate: { source: 'ai', brandAlignment: 92, confidence: null, checks: { brand: true } },
|
|
24
|
+
status: 'applied',
|
|
25
|
+
outcome: 'held',
|
|
26
|
+
outcomeMetrics: { priorClicks: 120, afterClicks: 130 },
|
|
27
|
+
appliedAt: new Date(Date.now() - 2 * 3600_000).toISOString(),
|
|
28
|
+
revertedAt: null,
|
|
29
|
+
revertReason: null,
|
|
30
|
+
...over,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function list(over = {}) {
|
|
34
|
+
return { docs: [row()], total: 1, page: 1, pageSize: 20, canRevert: true, ...over };
|
|
35
|
+
}
|
|
36
|
+
const fetchAutopilotApplied = vi.fn(async (_params) => list());
|
|
37
|
+
const revertAutopilotChange = vi.fn(async (_id, _force) => ({ ok: true }));
|
|
38
|
+
vi.mock('../../lib/seo-service.js', () => ({
|
|
39
|
+
fetchAutopilotApplied: (params) => fetchAutopilotApplied(params),
|
|
40
|
+
revertAutopilotChange: (id, force) => revertAutopilotChange(id, force),
|
|
41
|
+
}));
|
|
42
|
+
vi.mock('sonner', () => ({
|
|
43
|
+
toast: { success: vi.fn(), error: vi.fn(), info: vi.fn(), loading: vi.fn() },
|
|
44
|
+
}));
|
|
45
|
+
const { AutopilotAppliedSection } = await import('../../views/seo/AutopilotAppliedSection.js');
|
|
46
|
+
const { toast } = await import('sonner');
|
|
47
|
+
function deferred() {
|
|
48
|
+
let resolve;
|
|
49
|
+
const promise = new Promise((res) => {
|
|
50
|
+
resolve = res;
|
|
51
|
+
});
|
|
52
|
+
return { promise, resolve };
|
|
53
|
+
}
|
|
54
|
+
async function flushMicrotasks() {
|
|
55
|
+
await new Promise((r) => setTimeout(r, 0));
|
|
56
|
+
}
|
|
57
|
+
beforeEach(() => {
|
|
58
|
+
fetchAutopilotApplied.mockClear();
|
|
59
|
+
fetchAutopilotApplied.mockImplementation(async () => list());
|
|
60
|
+
revertAutopilotChange.mockClear();
|
|
61
|
+
revertAutopilotChange.mockImplementation(async () => ({ ok: true }));
|
|
62
|
+
vi.mocked(toast.success).mockClear();
|
|
63
|
+
vi.mocked(toast.error).mockClear();
|
|
64
|
+
});
|
|
65
|
+
describe('AutopilotAppliedSection', () => {
|
|
66
|
+
it('lists applied rows with before → after, brand score, kind, status, and outcome badges', async () => {
|
|
67
|
+
render(_jsx(AutopilotAppliedSection, {}));
|
|
68
|
+
const table = await screen.findByRole('table', { name: 'Changes applied by autopilot' });
|
|
69
|
+
expect(within(table).getByText('Pricing')).toBeTruthy();
|
|
70
|
+
expect(within(table).getByText('Missing meta title')).toBeTruthy();
|
|
71
|
+
expect(within(table).getByText('Issue fix')).toBeTruthy();
|
|
72
|
+
expect(within(table).getByText('Applied')).toBeTruthy();
|
|
73
|
+
expect(within(table).getByText('Pricing for growing teams')).toBeTruthy();
|
|
74
|
+
expect(within(table).getByLabelText('Brand voice score 92 out of 100')).toBeTruthy();
|
|
75
|
+
expect(within(table).getByText('Held')).toBeTruthy();
|
|
76
|
+
});
|
|
77
|
+
it('renders the applied time as a <time> with an absolute timestamp for assistive tech', async () => {
|
|
78
|
+
const appliedAt = new Date(Date.now() - 2 * 3600_000).toISOString();
|
|
79
|
+
fetchAutopilotApplied.mockImplementationOnce(async () => list({ docs: [row({ appliedAt })] }));
|
|
80
|
+
render(_jsx(AutopilotAppliedSection, {}));
|
|
81
|
+
await screen.findByRole('table', { name: 'Changes applied by autopilot' });
|
|
82
|
+
const time = document.querySelector('time');
|
|
83
|
+
expect(time).toBeTruthy();
|
|
84
|
+
expect(time?.getAttribute('dateTime')).toBe(appliedAt);
|
|
85
|
+
expect(time?.textContent).toContain('2h ago');
|
|
86
|
+
expect(time?.textContent).toContain(new Date(appliedAt).toLocaleString());
|
|
87
|
+
});
|
|
88
|
+
it('shows a redirect row as source → destination and hides pending / skipped outcomes', async () => {
|
|
89
|
+
fetchAutopilotApplied.mockImplementationOnce(async () => list({
|
|
90
|
+
docs: [
|
|
91
|
+
row({
|
|
92
|
+
id: 'la-r',
|
|
93
|
+
kind: 'redirect',
|
|
94
|
+
issueType: 'redirect',
|
|
95
|
+
entityId: null,
|
|
96
|
+
collection: null,
|
|
97
|
+
entityTitle: null,
|
|
98
|
+
entityUrl: '/old-page',
|
|
99
|
+
path: null,
|
|
100
|
+
before: null,
|
|
101
|
+
after: { source: '/old-page', destination: '/new-page', suggestionId: 's1' },
|
|
102
|
+
gate: { source: 'ai-404-recovery', brandAlignment: null, confidence: 0.91, checks: {} },
|
|
103
|
+
outcome: 'skipped',
|
|
104
|
+
}),
|
|
105
|
+
],
|
|
106
|
+
}));
|
|
107
|
+
render(_jsx(AutopilotAppliedSection, {}));
|
|
108
|
+
const table = await screen.findByRole('table', { name: 'Changes applied by autopilot' });
|
|
109
|
+
expect(within(table).getByText('Redirect')).toBeTruthy();
|
|
110
|
+
expect(within(table).getByText('404 recovery')).toBeTruthy();
|
|
111
|
+
// Title and the source side of the diff both read the redirect's source path.
|
|
112
|
+
expect(within(table).getAllByText('/old-page')).toHaveLength(2);
|
|
113
|
+
expect(within(table).getByText('/new-page')).toBeTruthy();
|
|
114
|
+
expect(within(table).getByText('91%')).toBeTruthy();
|
|
115
|
+
expect(within(table).queryByText('Not watched')).toBeNull();
|
|
116
|
+
expect(within(table).queryByText('Watching')).toBeNull();
|
|
117
|
+
// Redirects have no document behind them, so the title is never an editor link.
|
|
118
|
+
expect(within(table).queryByRole('button', { name: /in editor/ })).toBeNull();
|
|
119
|
+
});
|
|
120
|
+
it('opens the document editor through onNavigate from the entity title', async () => {
|
|
121
|
+
const onNavigate = vi.fn();
|
|
122
|
+
render(_jsx(AutopilotAppliedSection, { onNavigate: onNavigate }));
|
|
123
|
+
fireEvent.click(await screen.findByRole('button', { name: 'Open Pricing in editor' }));
|
|
124
|
+
expect(onNavigate).toHaveBeenCalledWith('/pages/doc-1/edit');
|
|
125
|
+
expect(screen.queryByRole('link')).toBeNull();
|
|
126
|
+
});
|
|
127
|
+
it('renders the entity title as plain text when there is no navigator', async () => {
|
|
128
|
+
render(_jsx(AutopilotAppliedSection, {}));
|
|
129
|
+
const table = await screen.findByRole('table', { name: 'Changes applied by autopilot' });
|
|
130
|
+
expect(within(table).queryByRole('button', { name: /in editor/ })).toBeNull();
|
|
131
|
+
const title = within(table).getByText('Pricing');
|
|
132
|
+
expect(title.tagName).toBe('SPAN');
|
|
133
|
+
expect(title.closest('button')).toBeNull();
|
|
134
|
+
});
|
|
135
|
+
it('hides Revert for non-admins and for rows that are no longer applied', async () => {
|
|
136
|
+
fetchAutopilotApplied.mockImplementationOnce(async () => list({
|
|
137
|
+
canRevert: true,
|
|
138
|
+
docs: [
|
|
139
|
+
row(),
|
|
140
|
+
row({ id: 'la-2', entityTitle: 'About', status: 'reverted', outcome: 'skipped' }),
|
|
141
|
+
row({ id: 'la-3', entityTitle: 'Blog', status: 'verify_failed', outcome: 'skipped' }),
|
|
142
|
+
],
|
|
143
|
+
total: 3,
|
|
144
|
+
}));
|
|
145
|
+
render(_jsx(AutopilotAppliedSection, {}));
|
|
146
|
+
const table = await screen.findByRole('table', { name: 'Changes applied by autopilot' });
|
|
147
|
+
expect(screen.getByRole('button', { name: 'Revert change to Pricing' })).toBeTruthy();
|
|
148
|
+
expect(screen.queryByRole('button', { name: 'Revert change to About' })).toBeNull();
|
|
149
|
+
expect(screen.queryByRole('button', { name: 'Revert change to Blog' })).toBeNull();
|
|
150
|
+
expect(within(table).getByText('Reverted')).toBeTruthy();
|
|
151
|
+
expect(within(table).getByText('Verify failed')).toBeTruthy();
|
|
152
|
+
});
|
|
153
|
+
it('hides Revert entirely when the caller cannot revert', async () => {
|
|
154
|
+
fetchAutopilotApplied.mockImplementationOnce(async () => list({ canRevert: false }));
|
|
155
|
+
render(_jsx(AutopilotAppliedSection, {}));
|
|
156
|
+
await screen.findByRole('table', { name: 'Changes applied by autopilot' });
|
|
157
|
+
expect(screen.queryByRole('button', { name: /revert/i })).toBeNull();
|
|
158
|
+
});
|
|
159
|
+
it('Revert asks for confirmation, posts, toasts, announces, refetches, and notifies the parent', async () => {
|
|
160
|
+
const onChanged = vi.fn();
|
|
161
|
+
render(_jsx(AutopilotAppliedSection, { onChanged: onChanged }));
|
|
162
|
+
await screen.findByRole('table', { name: 'Changes applied by autopilot' });
|
|
163
|
+
// The live region exists before anything happens so AT picks up the later text change.
|
|
164
|
+
const status = screen.getByRole('status');
|
|
165
|
+
expect(status.getAttribute('aria-live')).toBe('polite');
|
|
166
|
+
expect(status.textContent).toBe('');
|
|
167
|
+
fireEvent.click(screen.getByRole('button', { name: 'Revert change to Pricing' }));
|
|
168
|
+
expect(revertAutopilotChange).not.toHaveBeenCalled();
|
|
169
|
+
fireEvent.click(await screen.findByRole('button', { name: 'Revert change' }));
|
|
170
|
+
await waitFor(() => expect(revertAutopilotChange).toHaveBeenCalledWith('la-1', false));
|
|
171
|
+
await waitFor(() => expect(toast.success).toHaveBeenCalledWith('Change reverted.'));
|
|
172
|
+
await waitFor(() => expect(screen.getByRole('status').textContent).toContain('Reverted the change to “Pricing”'));
|
|
173
|
+
// Same element, text toggled — not a freshly mounted live region.
|
|
174
|
+
expect(screen.getByRole('status')).toBe(status);
|
|
175
|
+
await waitFor(() => expect(fetchAutopilotApplied).toHaveBeenCalledTimes(2));
|
|
176
|
+
// The table stays on screen during the silent refetch — no loading flash.
|
|
177
|
+
expect(screen.getByRole('table', { name: 'Changes applied by autopilot' })).toBeTruthy();
|
|
178
|
+
// The server reopened the issue; the parent must refetch its inbox.
|
|
179
|
+
expect(onChanged).toHaveBeenCalledTimes(1);
|
|
180
|
+
});
|
|
181
|
+
it('does not notify the parent when the revert conflicts or fails', async () => {
|
|
182
|
+
const onChanged = vi.fn();
|
|
183
|
+
revertAutopilotChange
|
|
184
|
+
.mockResolvedValueOnce({
|
|
185
|
+
ok: false,
|
|
186
|
+
error: 'Fields changed since autopilot applied them: metaTitle',
|
|
187
|
+
conflictFields: ['metaTitle'],
|
|
188
|
+
})
|
|
189
|
+
.mockResolvedValueOnce({ ok: false, error: 'Autopilot change not found' });
|
|
190
|
+
render(_jsx(AutopilotAppliedSection, { onChanged: onChanged }));
|
|
191
|
+
fireEvent.click(await screen.findByRole('button', { name: 'Revert change to Pricing' }));
|
|
192
|
+
fireEvent.click(await screen.findByRole('button', { name: 'Revert change' }));
|
|
193
|
+
const dialog = await screen.findByRole('dialog', { name: 'Someone edited this since' });
|
|
194
|
+
expect(onChanged).not.toHaveBeenCalled();
|
|
195
|
+
fireEvent.click(within(dialog).getByRole('button', { name: 'Revert anyway' }));
|
|
196
|
+
await waitFor(() => expect(toast.error).toHaveBeenCalledWith('Autopilot change not found'));
|
|
197
|
+
expect(revertAutopilotChange).toHaveBeenCalledTimes(2);
|
|
198
|
+
expect(onChanged).not.toHaveBeenCalled();
|
|
199
|
+
expect(screen.getByRole('status').textContent).toBe('');
|
|
200
|
+
});
|
|
201
|
+
it('a 409 re-prompts with the conflicting fields and Revert anyway forces the revert', async () => {
|
|
202
|
+
revertAutopilotChange
|
|
203
|
+
.mockResolvedValueOnce({
|
|
204
|
+
ok: false,
|
|
205
|
+
error: 'Fields changed since autopilot applied them: metaTitle',
|
|
206
|
+
conflictFields: ['metaTitle'],
|
|
207
|
+
})
|
|
208
|
+
.mockResolvedValueOnce({ ok: true });
|
|
209
|
+
render(_jsx(AutopilotAppliedSection, {}));
|
|
210
|
+
fireEvent.click(await screen.findByRole('button', { name: 'Revert change to Pricing' }));
|
|
211
|
+
fireEvent.click(await screen.findByRole('button', { name: 'Revert change' }));
|
|
212
|
+
const dialog = await screen.findByRole('dialog', { name: 'Someone edited this since' });
|
|
213
|
+
expect(dialog.textContent).toContain('metaTitle');
|
|
214
|
+
expect(toast.error).not.toHaveBeenCalled();
|
|
215
|
+
fireEvent.click(within(dialog).getByRole('button', { name: 'Revert anyway' }));
|
|
216
|
+
await waitFor(() => expect(revertAutopilotChange).toHaveBeenCalledWith('la-1', true));
|
|
217
|
+
await waitFor(() => expect(toast.success).toHaveBeenCalledWith('Change reverted.'));
|
|
218
|
+
});
|
|
219
|
+
it('surfaces non-conflict errors as a toast and leaves the row in place', async () => {
|
|
220
|
+
revertAutopilotChange.mockResolvedValueOnce({ ok: false, error: 'Autopilot change not found' });
|
|
221
|
+
render(_jsx(AutopilotAppliedSection, {}));
|
|
222
|
+
fireEvent.click(await screen.findByRole('button', { name: 'Revert change to Pricing' }));
|
|
223
|
+
fireEvent.click(await screen.findByRole('button', { name: 'Revert change' }));
|
|
224
|
+
await waitFor(() => expect(toast.error).toHaveBeenCalledWith('Autopilot change not found'));
|
|
225
|
+
expect(screen.queryByRole('dialog')).toBeNull();
|
|
226
|
+
expect(screen.getByRole('button', { name: 'Revert change to Pricing' })).toHaveProperty('disabled', false);
|
|
227
|
+
expect(fetchAutopilotApplied).toHaveBeenCalledTimes(1);
|
|
228
|
+
});
|
|
229
|
+
it('issues a single revert when confirm fires twice in the same tick and locks other rows', async () => {
|
|
230
|
+
fetchAutopilotApplied.mockImplementation(async () => list({ docs: [row(), row({ id: 'la-2', entityTitle: 'About' })], total: 2 }));
|
|
231
|
+
const inflight = deferred();
|
|
232
|
+
revertAutopilotChange.mockImplementationOnce(() => inflight.promise);
|
|
233
|
+
render(_jsx(AutopilotAppliedSection, {}));
|
|
234
|
+
fireEvent.click(await screen.findByRole('button', { name: 'Revert change to Pricing' }));
|
|
235
|
+
const confirm = await screen.findByRole('button', { name: 'Revert change' });
|
|
236
|
+
// Both clicks land before React commits the `mutation` state, so only the
|
|
237
|
+
// synchronous ref guard can stop the second `doRevert`.
|
|
238
|
+
act(() => {
|
|
239
|
+
confirm.click();
|
|
240
|
+
confirm.click();
|
|
241
|
+
});
|
|
242
|
+
await flushMicrotasks();
|
|
243
|
+
expect(revertAutopilotChange).toHaveBeenCalledTimes(1);
|
|
244
|
+
const about = screen.getByRole('button', { name: 'Revert change to About' });
|
|
245
|
+
expect(about).toHaveProperty('disabled', true);
|
|
246
|
+
inflight.resolve({ ok: true });
|
|
247
|
+
await waitFor(() => expect(about).toHaveProperty('disabled', false));
|
|
248
|
+
expect(revertAutopilotChange).toHaveBeenCalledTimes(1);
|
|
249
|
+
});
|
|
250
|
+
it('stays silent after unmount when the revert settles', async () => {
|
|
251
|
+
const inflight = deferred();
|
|
252
|
+
revertAutopilotChange.mockImplementationOnce(() => inflight.promise);
|
|
253
|
+
const { unmount } = render(_jsx(AutopilotAppliedSection, {}));
|
|
254
|
+
fireEvent.click(await screen.findByRole('button', { name: 'Revert change to Pricing' }));
|
|
255
|
+
fireEvent.click(await screen.findByRole('button', { name: 'Revert change' }));
|
|
256
|
+
await waitFor(() => expect(revertAutopilotChange).toHaveBeenCalledTimes(1));
|
|
257
|
+
unmount();
|
|
258
|
+
inflight.resolve({ ok: true });
|
|
259
|
+
await flushMicrotasks();
|
|
260
|
+
expect(toast.success).not.toHaveBeenCalled();
|
|
261
|
+
expect(fetchAutopilotApplied).toHaveBeenCalledTimes(1);
|
|
262
|
+
});
|
|
263
|
+
it('filters by status and outcome and resets to page 1', async () => {
|
|
264
|
+
render(_jsx(AutopilotAppliedSection, {}));
|
|
265
|
+
await screen.findByRole('table', { name: 'Changes applied by autopilot' });
|
|
266
|
+
fireEvent.change(screen.getByLabelText('Filter by status'), { target: { value: 'reverted' } });
|
|
267
|
+
await waitFor(() => expect(fetchAutopilotApplied).toHaveBeenLastCalledWith(expect.objectContaining({ page: 1, status: 'reverted', outcome: undefined })));
|
|
268
|
+
fireEvent.change(screen.getByLabelText('Filter by outcome'), { target: { value: 'regressed' } });
|
|
269
|
+
await waitFor(() => expect(fetchAutopilotApplied).toHaveBeenLastCalledWith(expect.objectContaining({ page: 1, status: 'reverted', outcome: 'regressed' })));
|
|
270
|
+
});
|
|
271
|
+
it('paginates through the ledger', async () => {
|
|
272
|
+
fetchAutopilotApplied.mockImplementation(async (params) => {
|
|
273
|
+
const p = params;
|
|
274
|
+
return list({
|
|
275
|
+
docs: [row({ id: `la-${p.page}`, entityTitle: `Page ${p.page}` })],
|
|
276
|
+
total: 45,
|
|
277
|
+
page: p.page,
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
render(_jsx(AutopilotAppliedSection, {}));
|
|
281
|
+
await screen.findByText('Page 1');
|
|
282
|
+
expect(screen.getByText('1–20 of 45')).toBeTruthy();
|
|
283
|
+
expect(screen.getByRole('button', { name: 'Previous' })).toHaveProperty('disabled', true);
|
|
284
|
+
fireEvent.click(screen.getByRole('button', { name: 'Next' }));
|
|
285
|
+
await screen.findByText('Page 2');
|
|
286
|
+
expect(fetchAutopilotApplied).toHaveBeenLastCalledWith(expect.objectContaining({ page: 2 }));
|
|
287
|
+
expect(screen.getByText('21–40 of 45')).toBeTruthy();
|
|
288
|
+
});
|
|
289
|
+
it('snaps back to the last page when a refetch lands on an empty page', async () => {
|
|
290
|
+
let total = 21;
|
|
291
|
+
fetchAutopilotApplied.mockImplementation(async (params) => {
|
|
292
|
+
const p = params;
|
|
293
|
+
const docs = (p.page - 1) * 20 < total
|
|
294
|
+
? [row({ id: `la-${p.page}`, entityTitle: `Page ${p.page}` })]
|
|
295
|
+
: [];
|
|
296
|
+
return list({ docs, total, page: p.page });
|
|
297
|
+
});
|
|
298
|
+
const { rerender } = render(_jsx(AutopilotAppliedSection, { refreshKey: 0 }));
|
|
299
|
+
await screen.findByText('Page 1');
|
|
300
|
+
fireEvent.click(screen.getByRole('button', { name: 'Next' }));
|
|
301
|
+
await screen.findByText('Page 2');
|
|
302
|
+
// The row on page 2 disappears (e.g. filtered out after a revert elsewhere).
|
|
303
|
+
total = 20;
|
|
304
|
+
rerender(_jsx(AutopilotAppliedSection, { refreshKey: 1 }));
|
|
305
|
+
await screen.findByText('Page 1');
|
|
306
|
+
expect(fetchAutopilotApplied).toHaveBeenLastCalledWith(expect.objectContaining({ page: 1 }));
|
|
307
|
+
expect(screen.queryByText('Autopilot has not applied anything yet')).toBeNull();
|
|
308
|
+
});
|
|
309
|
+
it('refetches when refreshKey changes', async () => {
|
|
310
|
+
const { rerender } = render(_jsx(AutopilotAppliedSection, { refreshKey: 0 }));
|
|
311
|
+
await screen.findByRole('table', { name: 'Changes applied by autopilot' });
|
|
312
|
+
rerender(_jsx(AutopilotAppliedSection, { refreshKey: 1 }));
|
|
313
|
+
await waitFor(() => expect(fetchAutopilotApplied).toHaveBeenCalledTimes(2));
|
|
314
|
+
});
|
|
315
|
+
it('shows the empty state with a settings shortcut and an error state with Retry', async () => {
|
|
316
|
+
const onNavigate = vi.fn();
|
|
317
|
+
fetchAutopilotApplied.mockImplementationOnce(async () => list({ docs: [], total: 0 }));
|
|
318
|
+
render(_jsx(AutopilotAppliedSection, { onNavigate: onNavigate }));
|
|
319
|
+
await screen.findByText('Autopilot has not applied anything yet');
|
|
320
|
+
fireEvent.click(screen.getByRole('button', { name: 'Open autopilot settings' }));
|
|
321
|
+
expect(onNavigate).toHaveBeenCalledWith('/settings?tab=seo');
|
|
322
|
+
fetchAutopilotApplied.mockRejectedValueOnce(new Error('boom'));
|
|
323
|
+
render(_jsx(AutopilotAppliedSection, {}));
|
|
324
|
+
const alert = await screen.findByRole('alert');
|
|
325
|
+
expect(alert.textContent).toContain('boom');
|
|
326
|
+
fireEvent.click(within(alert).getByRole('button', { name: 'Retry' }));
|
|
327
|
+
await waitFor(() => expect(fetchAutopilotApplied).toHaveBeenCalledTimes(3));
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
//# sourceMappingURL=seo-autopilot-applied.render.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo-autopilot-applied.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/seo-autopilot-applied.render.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo-autopilot-card.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/seo-autopilot-card.render.test.tsx"],"names":[],"mappings":""}
|