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()); 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_`), 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(), ); }); 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); }); }