diff --git a/package-lock.json b/package-lock.json index a05ff828c7..0a5be93bbb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -126,7 +126,7 @@ "@indutny/rezip-electron": "2.0.1", "@indutny/symbolicate-mac": "2.3.0", "@napi-rs/canvas": "0.1.61", - "@signalapp/mock-server": "10.4.0", + "@signalapp/mock-server": "10.4.1", "@storybook/addon-a11y": "8.4.4", "@storybook/addon-actions": "8.4.4", "@storybook/addon-controls": "8.4.4", @@ -6491,9 +6491,9 @@ } }, "node_modules/@signalapp/mock-server": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@signalapp/mock-server/-/mock-server-10.4.0.tgz", - "integrity": "sha512-Y2Fj2rP8sI/Z8JBjXgJoHO+6VqfORopeFixka11CrxxDBXQWr4u3+P3hsS5wIwwtgcsaXIultRW+kYhbkttRLw==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@signalapp/mock-server/-/mock-server-10.4.1.tgz", + "integrity": "sha512-9aBmFbOx3KfbN4Ptcx5PBRnVnROe6A58rRoErB/w1x+SSW9TjRHZxviJfgNpt9nGUOreryzOBsONSzWBIE12nQ==", "dev": true, "license": "AGPL-3.0-only", "dependencies": { diff --git a/package.json b/package.json index 399842d05e..205f883fbf 100644 --- a/package.json +++ b/package.json @@ -217,7 +217,7 @@ "@indutny/rezip-electron": "2.0.1", "@indutny/symbolicate-mac": "2.3.0", "@napi-rs/canvas": "0.1.61", - "@signalapp/mock-server": "10.4.0", + "@signalapp/mock-server": "10.4.1", "@storybook/addon-a11y": "8.4.4", "@storybook/addon-actions": "8.4.4", "@storybook/addon-controls": "8.4.4", diff --git a/ts/CI.ts b/ts/CI.ts index 0f56f48740..647415b32e 100644 --- a/ts/CI.ts +++ b/ts/CI.ts @@ -41,6 +41,7 @@ export type CIType = { uploadBackup(): Promise; unlink: () => void; print: (...args: ReadonlyArray) => void; + resetReleaseNotesFetcher(): void; }; export type GetCIOptionsType = Readonly<{ @@ -181,6 +182,17 @@ export function getCI({ deviceName }: GetCIOptionsType): CIType { handleEvent('print', format(...args)); } + async function resetReleaseNotesFetcher() { + await Promise.all([ + window.textsecure.storage.put( + 'releaseNotesVersionWatermark', + '7.0.0-alpha.1' + ), + window.textsecure.storage.put('releaseNotesPreviousManifestHash', ''), + window.textsecure.storage.put('releaseNotesNextFetchTime', Date.now()), + ]); + } + return { deviceName, getConversationId, @@ -195,5 +207,6 @@ export function getCI({ deviceName }: GetCIOptionsType): CIType { unlink, getPendingEventCount, print, + resetReleaseNotesFetcher, }; } diff --git a/ts/test-mock/bootstrap.ts b/ts/test-mock/bootstrap.ts index e368e952cb..365403e78b 100644 --- a/ts/test-mock/bootstrap.ts +++ b/ts/test-mock/bootstrap.ts @@ -725,6 +725,7 @@ export class Bootstrap { storageProfile: 'mock', serverUrl: url, storageUrl: url, + resourcesUrl: `${url}/updates2`, sfuUrl: url, cdn: { '0': url, diff --git a/ts/test-mock/release-notes/release_notes_test.ts b/ts/test-mock/release-notes/release_notes_test.ts new file mode 100644 index 0000000000..41a6bd5363 --- /dev/null +++ b/ts/test-mock/release-notes/release_notes_test.ts @@ -0,0 +1,57 @@ +// Copyright 2025 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only + +import createDebug from 'debug'; +import { assert } from 'chai'; + +import type { App } from '../playwright'; +import { Bootstrap } from '../bootstrap'; +import { MINUTE } from '../../util/durations'; + +import { SIGNAL_ACI } from '../../types/SignalConversation'; + +export const debug = createDebug('mock:test:releaseNotes'); + +describe('release notes', function (this: Mocha.Suite) { + let bootstrap: Bootstrap; + let app: App; + let nextApp: App; + + this.timeout(MINUTE); + beforeEach(async () => { + bootstrap = new Bootstrap(); + await bootstrap.init(); + + app = await bootstrap.link(); + }); + + afterEach(async function (this: Mocha.Context) { + if (!bootstrap) { + return; + } + + if (nextApp) { + await bootstrap.maybeSaveLogs(this.currentTest, nextApp); + } + await nextApp?.close(); + await bootstrap.teardown(); + }); + + it('shows release notes', async () => { + const firstWindow = await app.getWindow(); + + await firstWindow.evaluate('window.SignalCI.resetReleaseNotesFetcher()'); + + await app.close(); + + nextApp = await bootstrap.startApp(); + + const secondWindow = await nextApp.getWindow(); + + const leftPane = secondWindow.locator('#LeftPane'); + const releaseNoteConversation = leftPane.getByTestId(SIGNAL_ACI); + await releaseNoteConversation.waitFor(); + + assert.isTrue(await releaseNoteConversation.isVisible()); + }); +});