import unittest import release_manager class VersionTests(unittest.TestCase): def test_bumps_each_semver_component(self): self.assertEqual(release_manager.bump_semver("0.1.2", "patch"), "0.1.3") self.assertEqual(release_manager.bump_semver("0.1.2", "minor"), "0.2.0") self.assertEqual(release_manager.bump_semver("0.1.2", "major"), "1.0.0") def test_android_code_is_monotonic(self): self.assertEqual(release_manager.semantic_version_code("0.1.3"), 1003) self.assertEqual(release_manager.suggest_version_code("0.1.3", 5000), 5001) def test_rejects_non_release_semver(self): with self.assertRaises(ValueError): release_manager.parse_semver("1.2") class SafetyTests(unittest.TestCase): def test_detects_outputs_and_secrets(self): paths = [ "src/game/example.ts", "dist-android/assets/app.js", "android/app/release.apk", ".env.production", "FINE.key.ts", "scripts/content/publish-content.mjs", "public/data/healer-man-loot.sqlite", ] self.assertEqual( release_manager.find_dangerous_staged_paths(paths), [ "dist-android/assets/app.js", "android/app/release.apk", ".env.production", ], ) def test_truenas_commands_pin_expected_commit(self): block = release_manager.generate_truenas_deploy_commands("abc123") self.assertIn("EXPECTED_COMMIT='abc123'", block) self.assertIn("pull --ff-only", block) self.assertIn('test "$ACTUAL_COMMIT" = "$EXPECTED_COMMIT"', block) if __name__ == "__main__": unittest.main()