halkyon/packages/halkyon_base_server/test/unit/accounts_mode_test.dart

93 lines
2.9 KiB
Dart
Raw Normal View History

import 'package:halkyon_base_server/base.dart';
import 'package:test/test.dart';
void main() {
group('The accounts mode from the environment', () {
test('without settings, the server holds its own register, with no '
'members', () {
final mode = AccountsMode.fromEnvironment(const {});
expect(mode, isA<HoldsRegister>());
expect((mode as HoldsRegister).members, isEmpty);
});
test('the register tells the members it names, separated by commas or '
'spaces', () {
final mode = AccountsMode.fromEnvironment(const {
'INSTANCE_MEMBERS': ' https://todo.example.com, http://todo:8082 ',
});
expect((mode as HoldsRegister).members, [
Uri.parse('https://todo.example.com'),
Uri.parse('http://todo:8082'),
]);
});
test("each service's compose file names itself as a member of its own "
'(`INSTANCE_MEMBER_<NAME>`), beside those of `INSTANCE_MEMBERS`, each '
'once', () {
final mode = AccountsMode.fromEnvironment(const {
'INSTANCE_MEMBER_TODO': 'http://todo-server:8082/',
'INSTANCE_MEMBERS': 'http://train-server:8082/ https://other.example',
'INSTANCE_MEMBER_TRAIN': 'http://train-server:8082/',
'INSTANCE_MEMBER_EMPTY': '',
'INSTANCE_MEMBERSHIP': 'http://not-a-member',
});
expect((mode as HoldsRegister).members, [
Uri.parse('http://train-server:8082/'),
Uri.parse('https://other.example'),
Uri.parse('http://todo-server:8082/'),
]);
});
test('a register named makes the server its member', () {
final mode = AccountsMode.fromEnvironment(const {
'ACCOUNT_REGISTER_URL': 'http://learn:8082',
'INSTANCE_MEMBERS': 'http://ignored',
});
expect(
(mode as MemberOfRegister).register,
Uri.parse('http://learn:8082'),
);
});
test('empty values count as unset, as Compose passes them on', () {
expect(
AccountsMode.fromEnvironment(const {
'ACCOUNT_REGISTER_URL': '',
'INSTANCE_MEMBERS': ' ',
}),
isA<HoldsRegister>(),
);
});
test('anything but an HTTP(S) address is refused, not guessed at', () {
expect(
() => AccountsMode.fromEnvironment(const {
'ACCOUNT_REGISTER_URL': 'learn:8082',
}),
throwsArgumentError,
);
expect(
() => AccountsMode.fromEnvironment(const {
'INSTANCE_MEMBERS': 'ftp://todo',
}),
throwsArgumentError,
);
expect(
() => AccountsMode.fromEnvironment(const {
'INSTANCE_MEMBER_TODO': 'todo-server:8082',
}),
throwsArgumentError,
);
});
});
test('the shared secret is the same only when it is', () {
expect(isInstanceSecret('s3cret', 's3cret'), isTrue);
expect(isInstanceSecret('s3cret!', 's3cret'), isFalse);
expect(isInstanceSecret('', 's3cret'), isFalse);
});
}