halkyon_app's WhatsNew reads what each release changed from the app's assets/whats_new/ (<version>.<language>.txt, English and German, a change a line): after an update a sheet lists every release since the one the device showed last, newest first, once; Settings shows the running version's again, above About. Nothing on a fresh install. tool/release.dart drafts the missing texts from the commits that count after "Go on?" (German marked TRANSLATE:), opens them in the editor until they fit (no mark left, F-Droid's 500 characters) and commits them with the version. The English is the Forgejo notes' What's new, each language F-Droid's changelog of the build, written at publishing and copied in by tool/fdroid_repo.sh. Learn and Train bundle their texts, Learn's 0.22.0 and Train's 0.1.0 written to start. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
153 lines
4 KiB
Dart
153 lines
4 KiB
Dart
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<Commit> 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'),
|
|
);
|
|
});
|
|
}
|