import 'package:aitrainer_app/bloc/account/account_bloc.dart';
import 'package:aitrainer_app/repository/customer_repository.dart';
import 'package:mockito/mockito.dart';
import 'package:test/test.dart' as test;
import 'package:flutter_test/flutter_test.dart';

class MockCustomerRepository extends Mock implements CustomerRepository {}

void main() {
  MockCustomerRepository customerRepository;
  late AccountBloc accountBloc;

  TestWidgetsFlutterBinding.ensureInitialized();

  test.setUp(() {
    customerRepository = MockCustomerRepository();
    accountBloc = AccountBloc(customerRepository: customerRepository);
  });

  test.tearDown(() {
    accountBloc.close();
  });

  test.test('initial state is correct', () {
    expect(accountBloc.state, AccountInitial());
  });

  group('Account', () {
    test.test('emits [loading, logged in] when the customer clicked login', () {
      final expectedResponse = [
        AccountLoading(),
        AccountLoggedIn(),
      ];

      //verify(accountBloc.customerRepository.customer == null);

      expectLater(
        accountBloc,
        emitsInOrder(expectedResponse),
      );

      accountBloc.add(AccountLogin());
    });
  });

  test.test('emits [loading, logged out] when the customer clicked logout', () {
    final expectedResponse = [
      AccountLoading(),
      AccountLoggedOut(),
    ];

    expectLater(
      accountBloc,
      emitsInOrder(expectedResponse),
    );

    accountBloc.add(AccountLogout());
  });

  test.test('emits [loading, logged out] when the customer data changed', () {
    final expectedResponse = [
      AccountLoading(),
      AccountReady(),
    ];

    expectLater(
      accountBloc,
      emitsInOrder(expectedResponse),
    );

    accountBloc.add(AccountChangeCustomer());
  });
}
