halkyon/test/release/signing_keys_test.dart
Tizian 「ティツィアーン」 f06fc23023
All checks were successful
CI / check (push) Successful in 41m7s
CI / deploy (push) Successful in 1m2s
build(release): several apps released in one run (train:minor learn), their version commits pushed without the checks
The release tool and tool/with_signing_keys.sh take several apps, each with its version
after a colon or none, and release them one after another, each as alone, stopping at
the first that fails; the key script fetches every named app's key.

The pre-push hook skips tool/check.dart when a push brings release commits alone: the
release tool's chore(release) subject, an app's pubspec changed in its version line and
its texts of what's new, nothing else (tool/release_push.dart). Signatures are checked as
before, and CI still runs the checks. A release no longer costs a run of the checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-03 12:16:10 +01:00

92 lines
3.3 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:io';
import 'package:test/test.dart';
import '../../tool/src/release/apps.dart';
/// `tool/with_signing_keys.sh` fetches each app's keys from Proton Pass for a
/// release: it must know every app released, by the item its key is kept in
/// and the variable the release tool reads its path from.
void main() {
// The test runs in the repository's root, as `dart test` does.
final script = File('tool/with_signing_keys.sh').readAsStringSync();
test('every app released has its key fetched, under the variable the '
'release tool reads, from the item named for it', () {
for (final app in releasedApps.values) {
expect(
script,
contains(
' ${app.id}) app_variable=${app.android.keystoreVariable} '
"app_item='${app.name} – Android release keystore' ;;",
),
reason: app.id,
);
}
});
test("the F-Droid index's key comes along for an app listed there", () {
expect(releasedApps.values.where((app) => app.fdroid != null), isNotEmpty);
expect(script, contains('HALKYON_FDROID_KEYSTORE='));
expect(
script,
contains("fdroid_item='Halkyon Learn – F-Droid index keystore'"),
);
});
test('the keys go to a folder in memory, removed however the run ends', () {
expect(script, contains(r'mktemp -d -p "$XDG_RUNTIME_DIR"'));
expect(script, contains("trap 'rm -rf \"\$keys\"' EXIT"));
});
test("the keystores' passwords come from the items' field Password, "
'under the variables the release tool reads them from, but for a dry '
'run', () {
final releaser = File('tool/src/release/releaser.dart').readAsStringSync();
expect(script, contains('select(.name == "Password")'));
expect(
script,
contains(r'export "${app_variable}_PASSWORD=$app_password"'),
);
expect(
releaser,
contains(r"variable: '${app.android.keystoreVariable}_PASSWORD'"),
);
expect(
script,
contains(r'export HALKYON_FDROID_KEYSTORE_PASSWORD="$fdroid_password"'),
);
expect(releaser, contains("variable: 'HALKYON_FDROID_KEYSTORE_PASSWORD'"));
expect(script, contains(r'if ! $dry_run; then'));
expect(script, contains(r'export HALKYON_FORGEJO_TOKEN="$token"'));
expect(releaser, contains("variable: 'HALKYON_FORGEJO_TOKEN'"));
});
test("fdroid runs the F-Droid repository's script alone, with the "
"index's key and its password only", () {
expect(script, contains(r'tool/fdroid_repo.sh "$@" || status=$?'));
final alone = script.substring(
script.indexOf(r'if [ "$1" = fdroid ]; then'),
script.indexOf(r'tool/fdroid_repo.sh "$@"'),
);
expect(alone, isNot(contains('app_item')));
expect(alone, isNot(contains('forgejo_token')));
});
test('several apps named, each gets its own key, under its own name and '
'variable, and the release tool every argument as given', () {
expect(script, contains(r'*) apps+=("${word%%:*}") ;;'));
expect(script, contains('-* | major | minor | patch) ;;'));
expect(
script,
contains(
r'fetch "$app_item" android-release.p12 "$keys/$app-android-release.p12"',
),
);
expect(
script,
contains(r'export "$app_variable=$keys/$app-android-release.p12"'),
);
expect(script, contains(r'dart run tool/release.dart "$@" || status=$?'));
});
}