@prenta/admin 1.17.2 → 1.17.4

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 (49) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/__tests__/lib/posts-service.test.js +35 -0
  3. package/dist/__tests__/lib/posts-service.test.js.map +1 -1
  4. package/dist/__tests__/lib/public-path.test.d.ts +2 -0
  5. package/dist/__tests__/lib/public-path.test.d.ts.map +1 -0
  6. package/dist/__tests__/lib/public-path.test.js +25 -0
  7. package/dist/__tests__/lib/public-path.test.js.map +1 -0
  8. package/dist/__tests__/views/admin-section-renderers.test.js +1 -0
  9. package/dist/__tests__/views/admin-section-renderers.test.js.map +1 -1
  10. package/dist/__tests__/views/article-body-section.render.test.js +7 -0
  11. package/dist/__tests__/views/article-body-section.render.test.js.map +1 -1
  12. package/dist/__tests__/views/posts-list-view.render.test.js +11 -0
  13. package/dist/__tests__/views/posts-list-view.render.test.js.map +1 -1
  14. package/dist/__tests__/views/seo-autopilot-card.render.test.js +32 -47
  15. package/dist/__tests__/views/seo-autopilot-card.render.test.js.map +1 -1
  16. package/dist/__tests__/views/updates-tab.render.test.js +6 -2
  17. package/dist/__tests__/views/updates-tab.render.test.js.map +1 -1
  18. package/dist/lib/posts-service.d.ts +6 -0
  19. package/dist/lib/posts-service.d.ts.map +1 -1
  20. package/dist/lib/posts-service.js +6 -1
  21. package/dist/lib/posts-service.js.map +1 -1
  22. package/dist/lib/public-path.d.ts +21 -0
  23. package/dist/lib/public-path.d.ts.map +1 -0
  24. package/dist/lib/public-path.js +28 -0
  25. package/dist/lib/public-path.js.map +1 -0
  26. package/dist/views/Posts/PostsListView.d.ts.map +1 -1
  27. package/dist/views/Posts/PostsListView.js +1 -1
  28. package/dist/views/Posts/PostsListView.js.map +1 -1
  29. package/dist/views/page-editor/sections/ArticleBodySection.d.ts +3 -4
  30. package/dist/views/page-editor/sections/ArticleBodySection.d.ts.map +1 -1
  31. package/dist/views/page-editor/sections/ArticleBodySection.js +6 -5
  32. package/dist/views/page-editor/sections/ArticleBodySection.js.map +1 -1
  33. package/dist/views/page-editor/sections/admin-renderers.d.ts +3 -36
  34. package/dist/views/page-editor/sections/admin-renderers.d.ts.map +1 -1
  35. package/dist/views/page-editor/sections/admin-renderers.js +5 -5
  36. package/dist/views/page-editor/sections/admin-renderers.js.map +1 -1
  37. package/package.json +3 -3
  38. package/src/__tests__/lib/posts-service.test.ts +35 -0
  39. package/src/__tests__/lib/public-path.test.ts +37 -0
  40. package/src/__tests__/views/admin-section-renderers.test.tsx +1 -0
  41. package/src/__tests__/views/article-body-section.render.test.tsx +14 -0
  42. package/src/__tests__/views/posts-list-view.render.test.tsx +12 -0
  43. package/src/__tests__/views/seo-autopilot-card.render.test.tsx +32 -53
  44. package/src/__tests__/views/updates-tab.render.test.tsx +6 -2
  45. package/src/lib/posts-service.ts +12 -1
  46. package/src/lib/public-path.ts +33 -0
  47. package/src/views/Posts/PostsListView.tsx +2 -1
  48. package/src/views/page-editor/sections/ArticleBodySection.tsx +7 -5
  49. package/src/views/page-editor/sections/admin-renderers.tsx +5 -5
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @actuate-media/cms-admin
2
2
 
3
+ ## 1.17.4
4
+
5
+ ### Patch Changes
6
+
7
+ - 30d88ab: Sanitize draft HTML in the admin canvas with the cms-core allow-list before it is rendered. The sanitizer is available from `@prenta/core/sanitize` so the admin bundle does not import the server barrel.
8
+
9
+ ## 1.17.3
10
+
11
+ ### Patch Changes
12
+
13
+ - 2a46f45: The All Posts table subtitle rendered `/{collectionSlug}/{slug}`, so a `posts` collection relabelled Blog with `urlPrefix: 'blog'` still listed `/posts/…` (and `help/articles` / `careers` collections lied the same way). Rows now carry a `publicPath` built by the new `publicPathFor(urlPrefix, collectionSlug, slug)` helper: `/{urlPrefix}/{slug}` when a prefix is declared (nested prefixes supported), `/{slug}` when the prefix is the empty string, and `/{collectionSlug}/{slug}` only when no prefix is known. The collection slug is untouched — it remains the API / cache-tag / MCP identity. Fixes #921
14
+
3
15
  ## 1.17.2
4
16
 
5
17
  ### Patch Changes
@@ -175,6 +175,41 @@ describe('posts-service.fetchPosts', () => {
175
175
  seoScore: 88,
176
176
  });
177
177
  });
178
+ it('lists the public path from the collection urlPrefix, not the collection slug (#921)', async () => {
179
+ cmsApiMock.mockReset();
180
+ cmsApiMock.mockImplementation((url) => {
181
+ if (!url.startsWith('/posts'))
182
+ return { error: `unexpected url: ${url}` };
183
+ return {
184
+ data: {
185
+ ...POSTS_RESPONSE,
186
+ posts: [
187
+ { ...POSTS_RESPONSE.posts[1], id: 'p1', collection: 'posts', slug: 'seo-cost' },
188
+ { ...POSTS_RESPONSE.posts[1], id: 'r1', collection: 'resources', slug: 'guide' },
189
+ { ...POSTS_RESPONSE.posts[1], id: 'n1', collection: 'news', slug: 'q2' },
190
+ { ...POSTS_RESPONSE.posts[1], id: 'x1', collection: 'unknown-type', slug: 'orphan' },
191
+ ],
192
+ types: [
193
+ { ...POSTS_RESPONSE.types[0], slug: 'posts', urlPrefix: 'blog' },
194
+ { ...POSTS_RESPONSE.types[0], slug: 'resources', urlPrefix: '' },
195
+ { ...POSTS_RESPONSE.types[1], slug: 'news', urlPrefix: 'news' },
196
+ ],
197
+ },
198
+ };
199
+ });
200
+ const res = await fetchPosts({});
201
+ const byId = new Map(res.posts.map((p) => [p.id, p]));
202
+ // `posts` collection relabelled Blog with `urlPrefix: 'blog'` → /blog/{slug}.
203
+ expect(byId.get('p1')?.publicPath).toBe('/blog/seo-cost');
204
+ // Collection slug stays the API identity.
205
+ expect(byId.get('p1')?.postTypeId).toBe('posts');
206
+ // Empty urlPrefix (root-mounted) → /{slug}.
207
+ expect(byId.get('r1')?.publicPath).toBe('/guide');
208
+ // Prefix equal to slug is unchanged.
209
+ expect(byId.get('n1')?.publicPath).toBe('/news/q2');
210
+ // No type row for the collection → fall back to the collection slug.
211
+ expect(byId.get('x1')?.publicPath).toBe('/unknown-type/orphan');
212
+ });
178
213
  it('surfaces the scheduled date for SCHEDULED posts as the display date', async () => {
179
214
  const res = await fetchPosts({});
180
215
  const news = res.posts.find((p) => p.id === 'n1');
@@ -1 +1 @@
1
- {"version":3,"file":"posts-service.test.js","sourceRoot":"","sources":["../../../src/__tests__/lib/posts-service.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"posts-service.test.js","sourceRoot":"","sources":["../../../src/__tests__/lib/posts-service.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=public-path.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-path.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/lib/public-path.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { publicPathFor } from '../../lib/public-path.js';
3
+ describe('publicPathFor', () => {
4
+ it('lists /{urlPrefix}/{slug} when the collection declares a public prefix', () => {
5
+ // The collection slug (`posts`) is API identity; the public path is `/blog`.
6
+ expect(publicPathFor('blog', 'posts', 'how-much-do-seo-services-cost')).toBe('/blog/how-much-do-seo-services-cost');
7
+ });
8
+ it('falls back to /{collectionSlug}/{slug} when no urlPrefix is declared', () => {
9
+ expect(publicPathFor(undefined, 'posts', 'hello')).toBe('/posts/hello');
10
+ });
11
+ it('lists /{slug} when urlPrefix is the empty string (root-mounted collection)', () => {
12
+ expect(publicPathFor('', 'pages', 'about')).toBe('/about');
13
+ });
14
+ it('supports nested prefixes and trims stray slashes', () => {
15
+ expect(publicPathFor('help/articles', 'help-articles', 'reset-password')).toBe('/help/articles/reset-password');
16
+ expect(publicPathFor('/careers/', 'careers', '/senior-engineer/')).toBe('/careers/senior-engineer');
17
+ });
18
+ it('is unchanged for a type whose prefix equals its slug', () => {
19
+ expect(publicPathFor('news', 'news', 'q2-roadmap')).toBe('/news/q2-roadmap');
20
+ });
21
+ it('keeps a trailing slash placeholder when the slug is empty', () => {
22
+ expect(publicPathFor('blog', 'posts', '')).toBe('/blog/');
23
+ });
24
+ });
25
+ //# sourceMappingURL=public-path.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-path.test.js","sourceRoot":"","sources":["../../../src/__tests__/lib/public-path.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAExD,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,6EAA6E;QAC7E,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAC1E,qCAAqC,CACtC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IACzE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,aAAa,CAAC,eAAe,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAC5E,+BAA+B,CAChC,CAAA;QACD,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAAI,CACrE,0BAA0B,CAC3B,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC3D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -38,6 +38,7 @@ describe('pluggable admin section renderers', () => {
38
38
  render(_jsx(AdminSectionRenderersProvider, { value: renderers, children: _jsx(SectionRenderer, { section: customSection() }) }));
39
39
  const options = seen[0];
40
40
  expect(options.sanitizeHtml('<b>x</b>')).toBe('<b>x</b>');
41
+ expect(options.sanitizeHtml('<p>ok</p><script>alert(1)</script>')).not.toContain('script');
41
42
  expect(options.baseUrl).toBe('');
42
43
  expect(screen.getByAltText('x')).toBeTruthy();
43
44
  });
@@ -1 +1 @@
1
- {"version":3,"file":"admin-section-renderers.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/admin-section-renderers.test.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin-section-renderers.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/admin-section-renderers.test.tsx"],"names":[],"mappings":"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"}
@@ -20,5 +20,12 @@ describe('ArticleBodySection', () => {
20
20
  expect(container.querySelector('.prenta-rich-text')).toBeTruthy();
21
21
  expect(container.querySelector('.prose')).toBeNull();
22
22
  });
23
+ it('strips script tags from draft HTML before rendering (#396)', () => {
24
+ const { container } = render(_jsx(ArticleBodySection, { section: section({ source: 'field' }), context: { body: '<p>Safe copy</p><script>alert(1)</script>' } }));
25
+ const preview = container.querySelector('.prenta-rich-text');
26
+ expect(preview?.querySelector('script')).toBeNull();
27
+ expect(preview?.innerHTML).toContain('Safe copy');
28
+ expect(preview?.innerHTML).not.toContain('alert');
29
+ });
23
30
  });
24
31
  //# sourceMappingURL=article-body-section.render.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"article-body-section.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/article-body-section.render.test.tsx"],"names":[],"mappings":";AAAA,gCAAgC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wDAAwD,CAAA;AAG3F,SAAS,OAAO,CAAC,UAAmC,EAAE;IACpD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,WAAW,EAAE,cAAc;QAC3B,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,IAAI;QACb,OAAO;QACP,QAAQ,EAAE,EAAE;KACb,CAAA;AACH,CAAC;AAED,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAC1B,KAAC,kBAAkB,IACjB,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EACrC,OAAO,EAAE,EAAE,IAAI,EAAE,gDAAgD,EAAE,GACnE,CACH,CAAA;QAED,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QAC5F,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QACjE,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACtD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"article-body-section.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/article-body-section.render.test.tsx"],"names":[],"mappings":";AAAA,gCAAgC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wDAAwD,CAAA;AAG3F,SAAS,OAAO,CAAC,UAAmC,EAAE;IACpD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,WAAW,EAAE,cAAc;QAC3B,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,IAAI;QACb,OAAO;QACP,QAAQ,EAAE,EAAE;KACb,CAAA;AACH,CAAC;AAED,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAC1B,KAAC,kBAAkB,IACjB,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EACrC,OAAO,EAAE,EAAE,IAAI,EAAE,gDAAgD,EAAE,GACnE,CACH,CAAA;QAED,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QAC5F,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QACjE,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAC1B,KAAC,kBAAkB,IACjB,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EACrC,OAAO,EAAE,EAAE,IAAI,EAAE,2CAA2C,EAAE,GAC9D,CACH,CAAA;QAED,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAA;QAC5D,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;QACnD,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;QACjD,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -13,6 +13,9 @@ function makePost(id, title) {
13
13
  postTypeAccentColor: 'blue',
14
14
  title,
15
15
  slug: id,
16
+ // Public path comes from the collection's `urlPrefix` (`blog`), not the
17
+ // collection slug (`articles`) — see #921.
18
+ publicPath: `/blog/${id}`,
16
19
  authorName: 'Author',
17
20
  authorInitials: 'AU',
18
21
  status: 'PUBLISHED',
@@ -41,6 +44,14 @@ beforeEach(() => {
41
44
  bulkUpdatePosts.mockClear();
42
45
  bulkDeletePosts.mockClear();
43
46
  });
47
+ describe('PostsListView — row subtitle', () => {
48
+ it('shows the public path (/{urlPrefix}/{slug}) rather than /{collectionSlug}/{slug} (#921)', async () => {
49
+ render(_jsx(PostsListView, { onNavigate: () => { } }));
50
+ await screen.findByLabelText('Select "Alpha"');
51
+ expect(screen.getByText('/blog/a1')).toBeTruthy();
52
+ expect(screen.queryByText('/articles/a1')).toBeNull();
53
+ });
54
+ });
44
55
  describe('PostsListView — page-scoped selection', () => {
45
56
  it('clears the selection when navigating to another page so the bulk count stays honest', async () => {
46
57
  render(_jsx(PostsListView, { onNavigate: () => { } }));
@@ -1 +1 @@
1
- {"version":3,"file":"posts-list-view.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/posts-list-view.render.test.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"posts-list-view.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/posts-list-view.render.test.tsx"],"names":[],"mappings":"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"}
@@ -111,8 +111,10 @@ beforeEach(() => {
111
111
  describe('SeoAutopilotCard', () => {
112
112
  it('renders the master toggle, type groups, thresholds, and a Never run status', async () => {
113
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');
114
+ // The heading is present during the loading skeleton; wait on the first
115
+ // loaded control instead so the assertions below never race the fetch.
116
+ const toggle = await screen.findByRole('switch', { name: /enable autopilot/i });
117
+ expect(toggle.getAttribute('aria-checked')).toBe('false');
116
118
  expect(screen.getByText('Titles')).toBeTruthy();
117
119
  expect(screen.getByText('Redirects')).toBeTruthy();
118
120
  expect(screen.getByLabelText(/minimum brand alignment/i).value).toBe('85');
@@ -122,8 +124,7 @@ describe('SeoAutopilotCard', () => {
122
124
  });
123
125
  it('a blur-commit followed immediately by a checkbox click lands two PUTs, in order', async () => {
124
126
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
125
- await screen.findByText('SEO Autopilot');
126
- const brand = screen.getByLabelText(/minimum brand alignment/i);
127
+ const brand = await screen.findByLabelText(/minimum brand alignment/i);
127
128
  const checkbox = screen.getByLabelText('Missing meta title');
128
129
  fireEvent.change(brand, { target: { value: '90' } });
129
130
  // mousedown on the checkbox blurs the input (commit → PUT #1) and the click
@@ -143,9 +144,9 @@ describe('SeoAutopilotCard', () => {
143
144
  const gate = deferred();
144
145
  putGate = gate.promise;
145
146
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
146
- await screen.findByText('SEO Autopilot');
147
+ // The card region also wraps the loading skeleton; wait on a loaded control.
148
+ const checkbox = (await screen.findByLabelText('Missing meta title'));
147
149
  const card = screen.getByRole('region', { name: 'SEO Autopilot' });
148
- const checkbox = screen.getByLabelText('Missing meta title');
149
150
  checkbox.focus();
150
151
  fireEvent.click(checkbox);
151
152
  await waitFor(() => expect(card.getAttribute('aria-busy')).toBe('true'));
@@ -163,8 +164,7 @@ describe('SeoAutopilotCard', () => {
163
164
  runGate = gate.promise;
164
165
  current = { ...SETTINGS, enabled: true, enabledById: 'a' };
165
166
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
166
- await screen.findByText('SEO Autopilot');
167
- fireEvent.click(screen.getByRole('button', { name: /run now/i }));
167
+ fireEvent.click(await screen.findByRole('button', { name: /run now/i }));
168
168
  await waitFor(() => expect(cmsApi).toHaveBeenCalledWith('/seo/autopilot/run', expect.anything()));
169
169
  fireEvent.click(screen.getByLabelText('Missing meta title'));
170
170
  await waitFor(() => expect(toastInfo).toHaveBeenCalledTimes(1));
@@ -175,8 +175,7 @@ describe('SeoAutopilotCard', () => {
175
175
  });
176
176
  it('toggling a type PUTs a types patch', async () => {
177
177
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
178
- await screen.findByText('SEO Autopilot');
179
- fireEvent.click(screen.getByLabelText('Missing meta title'));
178
+ fireEvent.click(await screen.findByLabelText('Missing meta title'));
180
179
  await waitFor(() => expect(cmsApi).toHaveBeenCalledWith('/seo/autopilot/settings', expect.objectContaining({
181
180
  method: 'PUT',
182
181
  body: JSON.stringify({ types: { 'missing-meta-title': true } }),
@@ -186,15 +185,13 @@ describe('SeoAutopilotCard', () => {
186
185
  });
187
186
  it('toggling the master switch PUTs { enabled }', async () => {
188
187
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
189
- await screen.findByText('SEO Autopilot');
190
- fireEvent.click(screen.getByRole('switch', { name: /enable autopilot/i }));
188
+ fireEvent.click(await screen.findByRole('switch', { name: /enable autopilot/i }));
191
189
  await waitFor(() => expect(putBodies()).toEqual([{ enabled: true }]));
192
190
  await waitFor(() => expect(screen.getByRole('switch', { name: /enable autopilot/i }).getAttribute('aria-checked')).toBe('true'));
193
191
  });
194
192
  it('commits a clamped threshold on blur and sends the outcome-watch ratio as a fraction', async () => {
195
193
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
196
- await screen.findByText('SEO Autopilot');
197
- const brand = screen.getByLabelText(/minimum brand alignment/i);
194
+ const brand = await screen.findByLabelText(/minimum brand alignment/i);
198
195
  fireEvent.change(brand, { target: { value: '140' } });
199
196
  fireEvent.blur(brand);
200
197
  await waitFor(() => expect(putBodies()).toEqual([{ minBrandAlignment: 100 }]));
@@ -205,8 +202,7 @@ describe('SeoAutopilotCard', () => {
205
202
  });
206
203
  it('does not PUT when a number field is blurred unchanged or with garbage', async () => {
207
204
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
208
- await screen.findByText('SEO Autopilot');
209
- const perRun = screen.getByLabelText(/max changes per run/i);
205
+ const perRun = await screen.findByLabelText(/max changes per run/i);
210
206
  fireEvent.blur(perRun);
211
207
  fireEvent.change(perRun, { target: { value: '' } });
212
208
  fireEvent.blur(perRun);
@@ -216,8 +212,7 @@ describe('SeoAutopilotCard', () => {
216
212
  it('surfaces a PUT validation error verbatim and keeps the previous state', async () => {
217
213
  putResponse = { error: 'maxPerRun must be an integer between 1 and 25', status: 400 };
218
214
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
219
- await screen.findByText('SEO Autopilot');
220
- fireEvent.click(screen.getByLabelText('Missing meta title'));
215
+ fireEvent.click(await screen.findByLabelText('Missing meta title'));
221
216
  await waitFor(() => expect(toastError).toHaveBeenCalledWith('maxPerRun must be an integer between 1 and 25'));
222
217
  expect(toastSuccess).not.toHaveBeenCalled();
223
218
  expect(screen.getByLabelText('Missing meta title').checked).toBe(false);
@@ -225,8 +220,7 @@ describe('SeoAutopilotCard', () => {
225
220
  it('resets a number field to the last saved value when its PUT fails', async () => {
226
221
  putResponse = { error: 'maxPerRun must be an integer between 1 and 25', status: 400 };
227
222
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
228
- await screen.findByText('SEO Autopilot');
229
- const perRun = screen.getByLabelText(/max changes per run/i);
223
+ const perRun = (await screen.findByLabelText(/max changes per run/i));
230
224
  fireEvent.change(perRun, { target: { value: '9' } });
231
225
  fireEvent.blur(perRun);
232
226
  await waitFor(() => expect(toastError).toHaveBeenCalledWith('maxPerRun must be an integer between 1 and 25'));
@@ -305,16 +299,14 @@ describe('SeoAutopilotCard', () => {
305
299
  pausedTypes: { 'missing-meta-title': reason },
306
300
  };
307
301
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
308
- await screen.findByText('SEO Autopilot');
309
- const list = screen.getByRole('list', { name: /paused fix types/i });
302
+ const list = await screen.findByRole('list', { name: /paused fix types/i });
310
303
  expect(list.textContent ?? '').toContain(`Missing meta title — ${reason}`);
311
304
  fireEvent.click(within(list).getByRole('button', { name: /resume/i }));
312
305
  await waitFor(() => expect(putBodies()).toEqual([{ resumeTypes: ['missing-meta-title'] }]));
313
306
  });
314
307
  it('Run now is disabled while the policy is disabled and explains why', async () => {
315
308
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
316
- await screen.findByText('SEO Autopilot');
317
- const run = screen.getByRole('button', { name: /run now/i });
309
+ const run = (await screen.findByRole('button', { name: /run now/i }));
318
310
  expect(run.disabled).toBe(true);
319
311
  expect(run.getAttribute('title')).toMatch(/enable autopilot to run it now/i);
320
312
  const hintId = run.getAttribute('aria-describedby');
@@ -330,8 +322,7 @@ describe('SeoAutopilotCard', () => {
330
322
  pausedReason: 'manual',
331
323
  };
332
324
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
333
- await screen.findByText('SEO Autopilot');
334
- const run = screen.getByRole('button', { name: /run now/i });
325
+ const run = (await screen.findByRole('button', { name: /run now/i }));
335
326
  expect(run.disabled).toBe(true);
336
327
  expect(run.getAttribute('title')).toMatch(/resume autopilot to run it now/i);
337
328
  const hintId = run.getAttribute('aria-describedby');
@@ -340,8 +331,7 @@ describe('SeoAutopilotCard', () => {
340
331
  it('Run now carries no hint once it is runnable', async () => {
341
332
  current = { ...SETTINGS, enabled: true, enabledById: 'a' };
342
333
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
343
- await screen.findByText('SEO Autopilot');
344
- const run = screen.getByRole('button', { name: /run now/i });
334
+ const run = (await screen.findByRole('button', { name: /run now/i }));
345
335
  expect(run.disabled).toBe(false);
346
336
  expect(run.getAttribute('title')).toBeNull();
347
337
  expect(run.getAttribute('aria-describedby')).toBeNull();
@@ -349,8 +339,7 @@ describe('SeoAutopilotCard', () => {
349
339
  it('Run now POSTs /seo/autopilot/run and reloads', async () => {
350
340
  current = { ...SETTINGS, enabled: true, enabledById: 'a' };
351
341
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
352
- await screen.findByText('SEO Autopilot');
353
- const run = screen.getByRole('button', { name: /run now/i });
342
+ const run = await screen.findByRole('button', { name: /run now/i });
354
343
  expect(run.disabled).toBe(false);
355
344
  fireEvent.click(run);
356
345
  // Second click while in flight must not queue a second run.
@@ -376,8 +365,7 @@ describe('SeoAutopilotCard', () => {
376
365
  },
377
366
  };
378
367
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
379
- await screen.findByText('SEO Autopilot');
380
- const summary = screen.getByRole('status', { name: /last run/i });
368
+ const summary = await screen.findByRole('status', { name: /last run/i });
381
369
  expect(summary.textContent ?? '').toMatch(/4 applied/);
382
370
  expect(summary.textContent ?? '').toMatch(/1 verify-failed/);
383
371
  expect(summary.textContent ?? '').toMatch(/2 reverted/);
@@ -393,8 +381,7 @@ describe('SeoAutopilotCard', () => {
393
381
  lastRun: { ...RUN_SUMMARY, halted: true, haltedReason: 'verify_failures' },
394
382
  };
395
383
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
396
- await screen.findByText('SEO Autopilot');
397
- const halted = screen.getByRole('status', { name: /run stopped/i });
384
+ const halted = await screen.findByRole('status', { name: /run stopped/i });
398
385
  expect(halted.textContent ?? '').toMatch(/verification failures/i);
399
386
  expect(halted.className).toContain('text-warning');
400
387
  });
@@ -408,8 +395,7 @@ describe('SeoAutopilotCard', () => {
408
395
  lastRun: { ...RUN_SUMMARY, halted: true, haltedReason: 'budget_exhausted' },
409
396
  };
410
397
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
411
- await screen.findByText('SEO Autopilot');
412
- const halted = screen.getByRole('status', { name: /run stopped/i });
398
+ const halted = await screen.findByRole('status', { name: /run stopped/i });
413
399
  expect(halted.textContent ?? '').toMatch(/ran out of time/i);
414
400
  expect(halted.textContent ?? '').not.toMatch(/daily/i);
415
401
  });
@@ -426,8 +412,7 @@ describe('SeoAutopilotCard', () => {
426
412
  lastRun: { ...RUN_SUMMARY, halted: true, haltedReason: reason },
427
413
  };
428
414
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
429
- await screen.findByText('SEO Autopilot');
430
- const halted = screen.getByRole('status', { name: /run stopped/i });
415
+ const halted = await screen.findByRole('status', { name: /run stopped/i });
431
416
  expect(halted.textContent ?? '').toMatch(copy);
432
417
  expect(halted.textContent ?? '').not.toMatch(/stopped with an error/i);
433
418
  expect(halted.className).toContain('text-warning');
@@ -439,8 +424,8 @@ describe('SeoAutopilotCard', () => {
439
424
  lastRunAt: new Date(Date.now() - 5 * 60_000).toISOString(),
440
425
  };
441
426
  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);
427
+ const summary = await screen.findByRole('status', { name: /last run/i });
428
+ expect(summary.textContent ?? '').toMatch(/last run 5m ago/i);
444
429
  });
445
430
  it('offers every autopilot issue type exactly once (mirror of SEO_AUTOPILOT_ISSUE_TYPES)', () => {
446
431
  const ids = AUTOPILOT_TYPE_GROUPS.flatMap((g) => g.options.map((o) => o.id));
@@ -450,8 +435,8 @@ describe('SeoAutopilotCard', () => {
450
435
  it('read-only for non-admins', async () => {
451
436
  current = { ...SETTINGS, enabled: true, enabledById: 'a' };
452
437
  render(_jsx(SeoAutopilotCard, { canEdit: false, onNavigate: () => { } }));
453
- await screen.findByText('SEO Autopilot');
454
- expect(screen.getByRole('switch', { name: /enable autopilot/i }).disabled).toBe(true);
438
+ const toggle = await screen.findByRole('switch', { name: /enable autopilot/i });
439
+ expect(toggle.disabled).toBe(true);
455
440
  expect(screen.getByLabelText('Missing meta title').disabled).toBe(true);
456
441
  expect(screen.getByLabelText(/minimum brand alignment/i).disabled).toBe(true);
457
442
  expect(screen.getByRole('button', { name: /run now/i }).disabled).toBe(true);
@@ -465,8 +450,7 @@ describe('SeoAutopilotCard', () => {
465
450
  };
466
451
  const onNavigate = vi.fn();
467
452
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: onNavigate }));
468
- await screen.findByText('SEO Autopilot');
469
- const notice = screen.getByRole('region', { name: /governance/i });
453
+ const notice = await screen.findByRole('region', { name: /governance/i });
470
454
  expect(notice.getAttribute('role')).not.toBe('status');
471
455
  expect(notice.textContent ?? '').toMatch(/requires approval/i);
472
456
  fireEvent.click(within(notice).getByRole('button', { name: /settings → ai/i }));
@@ -480,7 +464,9 @@ describe('SeoAutopilotCard', () => {
480
464
  governance: { issueFixApprovalRequired: true, redirectApprovalRequired: false },
481
465
  };
482
466
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
483
- await screen.findByText('SEO Autopilot');
467
+ // Wait on a loaded control: against the skeleton the negative check below
468
+ // would pass vacuously.
469
+ await screen.findByRole('switch', { name: /enable autopilot/i });
484
470
  expect(screen.queryByRole('region', { name: /governance/i })).toBeNull();
485
471
  });
486
472
  it('keeps live regions to the last-run lines only', async () => {
@@ -495,8 +481,7 @@ describe('SeoAutopilotCard', () => {
495
481
  governance: { issueFixApprovalRequired: true, redirectApprovalRequired: false },
496
482
  };
497
483
  render(_jsx(SeoAutopilotCard, { canEdit: true, onNavigate: () => { } }));
498
- await screen.findByText('SEO Autopilot');
499
- const live = screen.getAllByRole('status').map((el) => el.getAttribute('aria-label'));
484
+ const live = (await screen.findAllByRole('status')).map((el) => el.getAttribute('aria-label'));
500
485
  expect(live.sort()).toEqual(['Last run', 'Run stopped']);
501
486
  });
502
487
  it('shows an error state with Retry when settings fail to load', async () => {