| // 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:convert'; |
| |
| import 'package:cocoon/repository/models/build_status.dart'; |
| import 'package:cocoon/repository/services/build_status_service.dart'; |
| import 'package:http/testing.dart'; |
| import 'package:http/http.dart' as http; |
| import 'package:test/test.dart'; |
| |
| void main() { |
| group('Build status fetch', () { |
| test('Successful fetch', () async { |
| final MockClient client = MockClient((http.Request request) async { |
| if (request.url.path == 'api/public/get-status') { |
| final Map<String, dynamic> mapJson = <String, dynamic>{ |
| 'AgentStatuses': <Map<String, dynamic>>[ |
| <String, dynamic>{ |
| 'AgentID': 'linux1', |
| 'IsHealthy': true, |
| 'HealthCheckTimestamp': DateTime.now() |
| .subtract(const Duration(minutes: 1)) |
| .millisecondsSinceEpoch |
| }, |
| <String, dynamic>{ |
| 'AgentID': 'linux2', |
| 'IsHealthy': false, |
| 'HealthCheckTimestamp': DateTime.now() |
| .subtract(const Duration(minutes: 1)) |
| .millisecondsSinceEpoch |
| }, |
| <String, dynamic>{ |
| 'AgentID': 'win1', |
| 'IsHealthy': true, |
| 'HealthCheckTimestamp': DateTime.now() |
| .subtract(const Duration(minutes: 11)) |
| .millisecondsSinceEpoch |
| }, |
| <String, dynamic>{ |
| 'AgentID': 'win2', |
| 'IsHealthy': false, |
| 'HealthCheckTimestamp': DateTime.now() |
| .subtract(const Duration(minutes: 11)) |
| .millisecondsSinceEpoch |
| }, |
| ], |
| 'Statuses': <Map<String, dynamic>>[ |
| <String, dynamic>{ |
| 'Checklist': <String, dynamic>{ |
| 'Checklist': <String, dynamic>{ |
| 'Commit': <String, dynamic>{ |
| 'Sha': '1234567890', |
| 'Author': <String, dynamic>{ |
| 'Login': 'smith', |
| 'avatar_url': 'https://www.google.com' |
| } |
| }, |
| 'CreateTimestamp': DateTime.now().millisecondsSinceEpoch |
| } |
| }, |
| 'Stages': <Map<String, dynamic>>[ |
| <String, dynamic>{ |
| 'Tasks': <Map<String, dynamic>>[ |
| <String, dynamic>{ |
| 'Task': <String, dynamic>{ |
| 'Flaky': false, |
| 'Status': 'Succeeded', |
| 'Name': 'test1' |
| } |
| }, |
| <String, dynamic>{ |
| 'Task': <String, dynamic>{ |
| 'Flaky': false, |
| 'Status': 'Failed', |
| 'Name': 'test2' |
| } |
| }, |
| <String, dynamic>{ |
| 'Task': <String, dynamic>{ |
| 'Flaky': true, |
| 'Status': 'Failed', |
| 'Name': 'test3' |
| } |
| }, |
| <String, dynamic>{ |
| 'Task': <String, dynamic>{ |
| 'Flaky': false, |
| 'Status': 'In Progress', |
| 'Name': 'test4' |
| } |
| }, |
| <String, dynamic>{ |
| 'Task': <String, dynamic>{ |
| 'Flaky': false, |
| 'Status': 'New', |
| 'Name': 'test5' |
| } |
| }, |
| ] |
| } |
| ] |
| } |
| ] |
| }; |
| return http.Response(json.encode(mapJson), 200); |
| } else { |
| final Map<String, dynamic> mapJson = <String, dynamic>{ |
| 'AnticipatedBuildStatus': 'Succeeded' |
| }; |
| return http.Response(json.encode(mapJson), 200); |
| } |
| }); |
| final BuildStatus status = await fetchBuildStatus(client: client); |
| |
| expect(status.failingAgents, <String>['linux2', 'win1', 'win2']); |
| expect(status.anticipatedBuildStatus, 'Succeeded'); |
| |
| final List<CommitTestResult> commitTestResults = status.commitTestResults; |
| CommitTestResult commitTestResult1 = commitTestResults.first; |
| expect(commitTestResult1.sha, '1234567890'); |
| expect(commitTestResult1.authorName, 'smith'); |
| expect(commitTestResult1.avatarImageURL, 'https://www.google.com'); |
| expect(commitTestResult1.createDateTime.runtimeType, DateTime); |
| expect(commitTestResult1.inProgressTestCount, 2); |
| expect(commitTestResult1.succeededTestCount, 1); |
| expect(commitTestResult1.failedFlakyTestCount, 1); |
| expect(commitTestResult1.failedTestCount, 1); |
| expect(commitTestResult1.failingTests, ['test2']); |
| }); |
| |
| test('Unexpected fetch', () async { |
| final MockClient client = MockClient((http.Request request) async { |
| final Map<String, dynamic> mapJson = <String, dynamic>{ |
| 'bogus': 'Failure' |
| }; |
| return http.Response(json.encode(mapJson), 200); |
| }); |
| final BuildStatus status = await fetchBuildStatus(client: client); |
| |
| expect(status, isNotNull); |
| expect(status.failingAgents, isEmpty); |
| expect(status.anticipatedBuildStatus, isNull); |
| }); |
| |
| test('Build fetch fails, get status succeeds', () async { |
| final MockClient client = MockClient((http.Request request) async { |
| if (request.url.path == 'api/public/get-status') { |
| final Map<String, dynamic> mapJson = <String, dynamic>{ |
| 'AgentStatuses': <Map<String, dynamic>>[ |
| <String, dynamic>{ |
| 'AgentID': 'linux1', |
| 'IsHealthy': true, |
| 'HealthCheckTimestamp': DateTime.now() |
| .subtract(const Duration(minutes: 1)) |
| .millisecondsSinceEpoch |
| }, |
| <String, dynamic>{ |
| 'AgentID': 'linux2', |
| 'IsHealthy': false, |
| 'HealthCheckTimestamp': DateTime.now() |
| .subtract(const Duration(minutes: 1)) |
| .millisecondsSinceEpoch |
| }, |
| <String, dynamic>{ |
| 'AgentID': 'win1', |
| 'IsHealthy': true, |
| 'HealthCheckTimestamp': DateTime.now() |
| .subtract(const Duration(minutes: 11)) |
| .millisecondsSinceEpoch |
| }, |
| <String, dynamic>{ |
| 'AgentID': 'win2', |
| 'IsHealthy': false, |
| 'HealthCheckTimestamp': DateTime.now() |
| .subtract(const Duration(minutes: 11)) |
| .millisecondsSinceEpoch |
| }, |
| ] |
| }; |
| return http.Response(json.encode(mapJson), 200); |
| } else { |
| return http.Response(null, 404); |
| } |
| }); |
| final BuildStatus status = await fetchBuildStatus(client: client); |
| |
| expect(status.failingAgents, <String>['linux2', 'win1', 'win2']); |
| expect(status.anticipatedBuildStatus, isNull); |
| }); |
| |
| test('Build fetch succeeds, get status fails', () async { |
| final MockClient client = MockClient((http.Request request) async { |
| if (request.url.path == 'api/public/get-status') { |
| return http.Response(null, 404); |
| } else { |
| final Map<String, dynamic> mapJson = <String, dynamic>{ |
| 'AnticipatedBuildStatus': 'Succeeded' |
| }; |
| return http.Response(json.encode(mapJson), 200); |
| } |
| }); |
| final BuildStatus status = await fetchBuildStatus(client: client); |
| |
| expect(status.failingAgents, const <String>[]); |
| expect(status.anticipatedBuildStatus, 'Succeeded'); |
| }); |
| |
| test('Failed fetch', () async { |
| final MockClient client = MockClient((http.Request request) async { |
| return http.Response(null, 404); |
| }); |
| final BuildStatus status = await fetchBuildStatus(client: client); |
| |
| expect(status.failingAgents, const <String>[]); |
| expect(status.anticipatedBuildStatus, isNull); |
| }); |
| }); |
| } |