import 'dart:convert'; import 'package:flutter_test/flutter_test.dart'; import 'package:halkyon_app/halkyon_app.dart'; import 'package:halkyon_base_client/halkyon_base_client.dart'; import 'package:http/http.dart' as http; import 'package:http/testing.dart'; /// [refusal] as an instance sends it: named by its module. String sent(SerializableException refusal) => jsonEncode({ 'className': 'halkyon_base.${switch (refusal) { EmailSignInRefusedException() => 'EmailSignInRefusedException', GitHubSignInRefusedException() => 'GitHubSignInRefusedException', _ => throw ArgumentError.value(refusal), }}', 'data': (refusal as SerializableModel).toJson(), }); void main() { test("reads the refusals an instance sends under halkyon_base's name, as " "an app's own generated protocol does", () { final protocol = BaseProtocol(); expect( protocol.decodeWithType( sent( EmailSignInRefusedException(reason: EmailSignInRefusal.wrongCode), ), ), isA().having( (refusal) => refusal.reason, 'reason', EmailSignInRefusal.wrongCode, ), ); expect( protocol.decodeWithType( sent( GitHubSignInRefusedException( reason: GitHubSignInRefusal.unknownAccount, ), ), ), isA().having( (refusal) => refusal.reason, 'reason', GitHubSignInRefusal.unknownAccount, ), ); }); test("calls halkyon_base's endpoints at the instance, and passes its " 'refusals on as themselves', () async { final asked = []; final client = BaseClient( 'https://learn.example.org/', httpClientOverride: MockClient((request) async { asked.add(request.url.toString()); return switch (request.url.path) { '/halkyon_base.instance/basics' => http.Response( jsonEncode( InstanceBasics( app: 'learn', emailSignIn: true, sourceCodeUrl: 'https://code.example.org/learn', minimumAppBuild: 21, dataLocation: 'EU', ).toJson(), ), 200, ), '/halkyon_base.emailSignIn/signIn' => http.Response( sent( EmailSignInRefusedException( reason: EmailSignInRefusal.codeExpired, ), ), 400, ), _ => http.Response('', 404), }; }), ); addTearDown(client.close); final basics = await client.modules.instance.basics(); expect(basics.emailSignIn, isTrue); expect(basics.minimumAppBuild, 21); expect(basics.dataLocation, 'EU'); await expectLater( client.modules.emailSignIn.signIn(switchToken: 'token'), throwsA( isA().having( (refusal) => refusal.reason, 'reason', EmailSignInRefusal.codeExpired, ), ), ); expect(asked, [ 'https://learn.example.org/halkyon_base.instance/basics', 'https://learn.example.org/halkyon_base.emailSignIn/signIn', ]); }); }