import 'package:test/test.dart'; import '../../tool/src/release/app_release.dart'; import '../../tool/src/release/notes.dart'; import '../../tool/src/release/version.dart'; import 'fixtures.dart'; void main() { const certificate = '27e243fcbdc826ff98ab7dbb10436c98c3bea24b2a015e94e4cfc7d1fc2a006c'; const fingerprint = 'E8082788756F6B7E682AA22FCEAD24B53E2A8B0912AD66D65E8C2D4F07BB94B0'; const signer = '0123456789ABCDEF0123456789ABCDEF01234567'; String notes({ AppRelease app = testApp, String? previousTag = 'notes-v0.18.0', List commits = const [], String? whatsNew, }) => releaseNotes( app: app, version: const Version(0, 19, 0), previousTag: previousTag, commits: commits, certificate: certificate, fdroidFingerprint: fingerprint, signer: signer, whatsNew: whatsNew, ); test("with what's new, the notes give it in place of the commits", () { final text = notes( commits: const [Commit(hash: 'a', subject: 'feat: tiles')], whatsNew: '- Tiles on the first start.\n\n- Flags.\n', ); expect( text, contains( "the project's instance.\n" '\n' "### What's new\n" '\n' '- Tiles on the first start.\n' '- Flags.\n' '\n' '### Installing\n', ), ); expect(text, isNot(contains('### Features'))); }); test("a release's notes list its features and fixes, oldest first, " 'without their types and scopes', () { final text = notes( commits: const [ Commit(hash: 'a', subject: 'feat(app): tiles on the first start'), Commit(hash: 'b', subject: 'docs: why'), Commit(hash: 'c', subject: 'fix(sync)!: no lost rating'), Commit(hash: 'd', subject: 'perf: faster library'), Commit(hash: 'e', subject: 'feat: flags'), ], ); expect( text, startsWith( 'Halkyon Notes 0.19.0 for Android and Linux. Both connect to ' "notes.halkyon.eu, the project's instance.\n" '\n' '### Features\n' '\n' '- tiles on the first start\n' '- flags\n' '\n' '### Fixes\n' '\n' '- no lost rating\n' '- faster library\n' '\n' '### Installing\n', ), ); }); test('they say how to install and check every file', () { final text = notes( commits: const [Commit(hash: 'a', subject: 'fix: x')], ); expect( text, contains( '- **Android:** `halkyon-notes-0.19.0.apk`, one APK for every phone, ' "signed with the app's key; the SHA-256 of its certificate is " '`$certificate`.\n', ), ); expect( text, contains( '- **F-Droid:** the same APK in the repository ' 'https://halkyon.app/fdroid/repo?fingerprint=$fingerprint\n', ), ); expect( text, contains( '- **Linux:** `halkyon-notes_0.19.0_amd64.snap`: `sudo snap install ' '--dangerous halkyon-notes_0.19.0_amd64.snap` (not in the Snap Store ' 'yet).\n', ), ); expect( text, endsWith( "`SHA256SUMS` lists the files' checksums, signed with the GPG key " '`$signer` (`SHA256SUMS.asc`).', ), ); }); test('a snap in the Store is installed from its channel', () { final text = notes( app: testApp.copyWith( snap: const SnapRelease( name: 'halkyon-notes', part: 'halkyon-notes', directory: 'snap', storeChannel: 'edge', ), ), ); expect( text, contains( '- **Linux:** `halkyon-notes_0.19.0_amd64.snap`, also in the Snap ' 'Store: `snap install halkyon-notes --edge`.\n', ), ); }); test('the first release says so, one without features or fixes too', () { expect(notes(previousTag: null), contains('\n\nThe first release.\n\n')); expect( notes( commits: const [Commit(hash: 'a', subject: 'docs: x')], ), contains('\n\nNo features or fixes since notes-v0.18.0.\n\n'), ); }); }