blob: 9d634e27c6d89c40d697048cdb4648e1a39e0689 [file] [log] [blame]
// Copyright 2019 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:cocoon_service/protos.dart' show Agent;
import 'package:app_flutter/service/cocoon.dart';
import 'package:app_flutter/state/agent.dart';
import '../utils/mocks.dart';
import '../utils/output.dart';
void main() {
group('AgentState', () {
MockCocoonService mockCocoonService;
MockGoogleSignInService mockSignInService;
setUp(() {
mockSignInService = MockGoogleSignInService();
mockCocoonService = MockCocoonService();
when(mockCocoonService.fetchAgentStatuses()).thenAnswer(
(_) => Future<CocoonResponse<List<Agent>>>.value(CocoonResponse<List<Agent>>.data(<Agent>[Agent()])));
});
tearDown(() {
clearInteractions(mockSignInService);
clearInteractions(mockCocoonService);
});
testWidgets('timer should periodically fetch updates', (WidgetTester tester) async {
final AgentState agentState = AgentState(cocoonService: mockCocoonService, authService: mockSignInService);
verifyNever(mockCocoonService.fetchAgentStatuses());
void listener() {}
agentState.addListener(listener);
// startFetching immediately starts fetching results
verify(mockCocoonService.fetchAgentStatuses()).called(1);
verifyNever(mockCocoonService.fetchAgentStatuses());
await tester.pump(agentState.refreshRate);
verify(mockCocoonService.fetchAgentStatuses()).called(1);
await tester.pump(agentState.refreshRate);
verify(mockCocoonService.fetchAgentStatuses()).called(1);
agentState.dispose();
});
testWidgets('multiple start updates should not change the timer', (WidgetTester tester) async {
final AgentState agentState = AgentState(cocoonService: mockCocoonService, authService: mockSignInService);
void listener1() {}
agentState.addListener(listener1);
final Timer refreshTimer = agentState.refreshTimer;
// This second listener should not change the refresh timer.
void listener2() {}
agentState.addListener(listener2);
expect(refreshTimer, equals(agentState.refreshTimer));
agentState.dispose();
});
testWidgets('fetching agents error should not delete previous data', (WidgetTester tester) async {
String lastError;
final AgentState agentState = AgentState(cocoonService: mockCocoonService, authService: mockSignInService)
..errors.addListener((String message) => lastError = message);
verifyNever(mockCocoonService.fetchAgentStatuses());
void listener1() {}
agentState.addListener(listener1);
verify(mockCocoonService.fetchAgentStatuses()).called(1);
await tester.pump(agentState.refreshRate);
final List<Agent> originalData = agentState.agents;
when(mockCocoonService.fetchAgentStatuses()).thenAnswer(
(_) => Future<CocoonResponse<List<Agent>>>.value(const CocoonResponse<List<Agent>>.error('error')),
);
await checkOutput(
block: () async {
await tester.pump(agentState.refreshRate);
verify(mockCocoonService.fetchAgentStatuses()).called(2);
},
output: <String>[
'An error occured fetching agent statuses from Cocoon: error',
],
);
expect(agentState.agents, originalData);
expect(lastError, startsWith(AgentState.errorMessageFetchingStatuses));
agentState.dispose();
});
test('authorize agent calls cocoon service', () async {
final AgentState agentState = AgentState(cocoonService: mockCocoonService, authService: mockSignInService);
when(mockCocoonService.authorizeAgent(any, any)).thenAnswer(
(_) async => const CocoonResponse<String>.data('abc123'),
);
verifyNever(mockCocoonService.authorizeAgent(any, any));
await agentState.authorizeAgent(Agent());
verify(mockCocoonService.authorizeAgent(any, any)).called(1);
agentState.dispose();
});
test('reserve task calls cocoon service', () async {
final AgentState agentState = AgentState(cocoonService: mockCocoonService, authService: mockSignInService);
verifyNever(mockCocoonService.reserveTask(any, any));
await agentState.reserveTask(Agent());
verify(mockCocoonService.reserveTask(any, any)).called(1);
agentState.dispose();
});
});
}