// Copyright (C) 2022 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.

import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:wyatt_authentication_bloc/wyatt_authentication_bloc.dart';

class MockAccount extends Mock implements Account {}

void main() {
  group('AuthenticationState', () {
    group('unauthenticated', () {
      test('has correct status', () {
        const AuthenticationState<void> state =
            AuthenticationState.unauthenticated();
        expect(state.status, AuthenticationStatus.unauthenticated);
        expect(state.accountWrapper, null);
      });
    });

    group('authenticated', () {
      test('has correct status', () {
        final MockAccount account = MockAccount();
        final AuthenticationState<void> state =
            AuthenticationState.authenticated(
          AccountWrapperModel<void>(account, null),
        );
        expect(state.status, AuthenticationStatus.authenticated);
        expect(state.accountWrapper?.account, account);
      });
    });

    group('authenticated with extra data', () {
      test('has correct status', () {
        final MockAccount account = MockAccount();
        const String extra = 'AwesomeExtraData';
        final AuthenticationState<String> state =
            AuthenticationState.authenticated(
          AccountWrapperModel(account, extra),
        );
        expect(state.status, AuthenticationStatus.authenticated);
        expect(state.accountWrapper?.account, account);
        expect(state.accountWrapper?.data, extra);
      });
    });
  });
}
