Files
supabase/apps/studio/tests/components/interfaces/App/AppBannerWrapper.utils.test.ts
T
Danny White b5c865521f feat(studio): notify users about the Terms of Service update (#51302)
## Problem

Dashboard users need a notice about the Terms of Service update
alongside #51106 and #51107.

## Solution

Reuse the organisation landing-page notice pattern from #50397. A
compact “We've updated our Terms of Service.” notice opens the
explanation and agreement link through **Learn more**. Closing the
notice or choosing **Got it** remembers dismissal in the browser with a
new version-specific key.

```text
Organisation landing page
  Notice → Learn more → Explanation and Terms of Service link
  Close / Got it → Remember dismissal
```

| After |
| --- |
| <img width="628" height="444" alt="CleanShot 2026-10-06 at 14 47
46@2x"
src="https://github.com/user-attachments/assets/72922712-321f-4972-b20c-1a075e0745d0"
/> |
| _Banner_ |
| <img width="1078" height="718" alt="CleanShot 2026-10-06 at 16 58
18@2x"
src="https://github.com/user-attachments/assets/2109c2ab-e9b7-4855-8acb-42d5232cd002"
/> |
| _Dialog_ |

## Review instructions

1. Open `/organizations` or an organisation's `/org/<slug>` landing page
in the hosted Studio preview. Expect the compact notice.
2. Click **Learn more**. Expect the explanation and a link to the Terms
of Service. Escape closes the dialog without dismissing the notice.
3. Choose **Got it**, then reload. The notice stays dismissed. Repeat in
a fresh browser profile using **Close banner**.
4. Open a project or an organisation settings page. The notice should
not appear.
2026-10-07 09:09:01 +11:00

51 lines
1.2 KiB
TypeScript

import { describe, expect, test } from 'vitest'
import {
isLogsOrObservabilityPath,
isOrganizationLandingPath,
} from '@/components/interfaces/App/AppBannerWrapper.utils'
describe('isLogsOrObservabilityPath', () => {
test.each([
'/project/abc/logs',
'/project/abc/logs/',
'/project/abc/logs/explorer',
'/project/abc/observability',
'/project/abc/observability/query-performance',
])('matches %s', (pathname) => {
expect(isLogsOrObservabilityPath(pathname)).toBe(true)
})
test.each([
undefined,
null,
'',
'/project/abc',
'/project/abc/editor',
'/project/abc/logs-explorer',
'/project/abc/functions/my-fn/logs',
'/org/abc/logs',
])('does not match %s', (pathname) => {
expect(isLogsOrObservabilityPath(pathname)).toBe(false)
})
})
describe('isOrganizationLandingPath', () => {
test.each(['/org', '/organizations', '/org/my-org', '/org/my-org/'])('matches %s', (pathname) => {
expect(isOrganizationLandingPath(pathname)).toBe(true)
})
test.each([
undefined,
null,
'',
'/',
'/sign-in',
'/project/abc',
'/org/abc/general',
'/organizations/new',
])('does not match %s', (pathname) => {
expect(isOrganizationLandingPath(pathname)).toBe(false)
})
})