blob: 157581d72b9fcbd28a6c14762468b0cbb9c83208 [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 'package:flutter_web_test/flutter_web_test.dart';
import 'package:flutter_web/material.dart';
import 'package:cocoon/repository/details/infrastructure.dart';
import 'package:cocoon/repository/models/build_status.dart';
import 'package:cocoon/repository/models/status_page_status.dart';
import 'package:cocoon/repository/models/providers.dart';
void main() {
group('status page widget', () {
testWidgets('Operational', (WidgetTester tester) async {
const String statusText =
'Status provided by StatusPage'; // Status text is provided by StatusPage, so there's no logic needed in the dashboard to handle different variants.
const StatusPageStatus status =
StatusPageStatus(status: statusText, indicator: 'none');
await _pumpStatusPageWidget(tester, status);
final Finder statusFinder = find.text(statusText);
expect(statusFinder, findsOneWidget);
final Finder iconFinder = find.byIcon(Icons.check);
expect(iconFinder, findsOneWidget);
});
testWidgets('Minor', (WidgetTester tester) async {
const StatusPageStatus statusPageStatus =
StatusPageStatus(status: 'Failure', indicator: 'minor');
await _pumpStatusPageWidget(tester, statusPageStatus);
final Finder iconFinder = find.byIcon(Icons.warning);
expect(iconFinder, findsOneWidget);
});
testWidgets('Major', (WidgetTester tester) async {
const StatusPageStatus statusPageStatus =
StatusPageStatus(status: 'Failure', indicator: 'major');
await _pumpStatusPageWidget(tester, statusPageStatus);
final Finder iconFinder = find.byIcon(Icons.error);
expect(iconFinder, findsOneWidget);
});
testWidgets('Critical', (WidgetTester tester) async {
const StatusPageStatus statusPageStatus =
StatusPageStatus(status: 'Failure', indicator: 'critical');
await _pumpStatusPageWidget(tester, statusPageStatus);
final Finder iconFinder = find.byIcon(Icons.error);
expect(iconFinder, findsOneWidget);
});
testWidgets('Maintenence', (WidgetTester tester) async {
const StatusPageStatus statusPageStatus =
StatusPageStatus(status: 'Failure', indicator: 'maintenance');
await _pumpStatusPageWidget(tester, statusPageStatus);
final Finder iconFinder = find.byIcon(Icons.error);
expect(iconFinder, findsOneWidget);
});
testWidgets('Bogus', (WidgetTester tester) async {
const StatusPageStatus statusPageStatus =
StatusPageStatus(indicator: 'bogus unknown indicator');
await _pumpStatusPageWidget(tester, statusPageStatus);
final Finder iconFinder = find.byIcon(Icons.help_outline);
expect(iconFinder, findsOneWidget);
});
testWidgets('Unknown', (WidgetTester tester) async {
const StatusPageStatus statusPageStatus = StatusPageStatus();
await _pumpStatusPageWidget(tester, statusPageStatus);
final Finder iconFinder = find.byIcon(Icons.help_outline);
expect(iconFinder, findsOneWidget);
final Finder statusFinder = find.text('Unknown');
expect(statusFinder, findsOneWidget);
});
});
group('Build status widget', () {
testWidgets('Succeeded', (WidgetTester tester) async {
const BuildStatus buildStatus =
BuildStatus(anticipatedBuildStatus: 'Succeeded');
await _pumpBuildStatusWidget(tester, buildStatus);
final Finder iconFinder = find.byIcon(Icons.check);
expect(iconFinder, findsOneWidget);
});
testWidgets('Will fail', (WidgetTester tester) async {
const BuildStatus buildStatus =
BuildStatus(anticipatedBuildStatus: 'Build Will Fail');
await _pumpBuildStatusWidget(tester, buildStatus);
final Finder iconFinder = find.byIcon(Icons.error);
expect(iconFinder, findsOneWidget);
});
testWidgets('failed', (WidgetTester tester) async {
const BuildStatus buildStatus =
BuildStatus(anticipatedBuildStatus: 'Failed');
await _pumpBuildStatusWidget(tester, buildStatus);
final Finder iconFinder = find.byIcon(Icons.error);
expect(iconFinder, findsOneWidget);
});
testWidgets('Bogus', (WidgetTester tester) async {
const BuildStatus buildStatus =
BuildStatus(anticipatedBuildStatus: 'Bogus unknown status');
await _pumpBuildStatusWidget(tester, buildStatus);
final Finder iconFinder = find.byIcon(Icons.help_outline);
expect(iconFinder, findsOneWidget);
});
testWidgets('Unknown', (WidgetTester tester) async {
const BuildStatus buildStatus = BuildStatus();
await _pumpBuildStatusWidget(tester, buildStatus);
final Finder iconFinder = find.byIcon(Icons.help_outline);
expect(iconFinder, findsOneWidget);
});
});
group('Failing agents widget', () {
testWidgets('None', (WidgetTester tester) async {
const BuildStatus buildStatus = BuildStatus();
await _pumpFailingAgentsWidget(tester, buildStatus);
final Finder titleFinder = find.text('Failing Agents');
expect(titleFinder, findsNothing);
});
testWidgets('One', (WidgetTester tester) async {
const BuildStatus buildStatus =
BuildStatus(failingAgents: <String>['mac1']);
await _pumpFailingAgentsWidget(tester, buildStatus);
final Finder titleFinder = find.text('Failing Agents');
expect(titleFinder, findsOneWidget);
final Finder iconFinder = find.byIcon(Icons.desktop_windows);
expect(iconFinder, findsOneWidget);
final Finder agentFinder = find.text('mac1');
expect(agentFinder, findsOneWidget);
});
testWidgets('Two', (WidgetTester tester) async {
const BuildStatus buildStatus =
BuildStatus(failingAgents: <String>['mac1', 'windows1']);
await _pumpFailingAgentsWidget(tester, buildStatus);
final Finder titleFinder = find.text('Failing Agents');
expect(titleFinder, findsOneWidget);
final Finder iconFinder = find.byIcon(Icons.desktop_windows);
expect(iconFinder, findsNWidgets(2));
final Finder agentFinder1 = find.text('mac1');
expect(agentFinder1, findsOneWidget);
final Finder agentFinder2 = find.text('windows1');
expect(agentFinder2, findsOneWidget);
});
});
group('Post-commit test widget', () {
testWidgets('None', (WidgetTester tester) async {
const BuildStatus buildStatus = BuildStatus();
await _pumpCommitResultsWidget(tester, buildStatus);
final Finder titleFinder = find.byType(ListTile);
expect(titleFinder, findsNothing);
});
testWidgets('Commit results', (WidgetTester tester) async {
BuildStatus buildStatus =
BuildStatus(commitTestResults: <CommitTestResult>[
CommitTestResult(
sha: '123456789',
avatarImageURL: 'https://www.google.com',
createDateTime: DateTime(2019, 1, 1, 13, 10),
inProgressTestCount: 10,
succeededTestCount: 20,
failedFlakyTestCount: 30,
failedTestCount: 40,
failingTests: <String>['test1', 'test2', 'test3']),
CommitTestResult(
sha: '5678',
avatarImageURL: 'https://about.google',
createDateTime: DateTime(2019, 1, 1, 5, 20),
inProgressTestCount: 50,
succeededTestCount: 60,
failedFlakyTestCount: 70,
failedTestCount: 0),
CommitTestResult(
sha: '987654321',
avatarImageURL: 'https://store.google.com',
createDateTime: DateTime(2019, 1, 1, 11, 59),
inProgressTestCount: 0,
succeededTestCount: 80,
failedFlakyTestCount: 90,
failedTestCount: 0),
]);
await _pumpCommitResultsWidget(tester, buildStatus);
final Finder listTileFinder =
find.byWidgetPredicate((Widget widget) => widget is ListTile);
expect(listTileFinder, findsNWidgets(3));
ListTile firstResult = tester.widget<ListTile>(listTileFinder.first);
expect((firstResult.title as Text).data, '[123456] 1:10 PM');
// First commit
final CircleAvatar firstLeading = firstResult.leading;
expect((firstLeading.child as Icon).icon, Icons.error);
final CircleAvatar firstTrailing = firstResult.trailing;
final Image firstImage = firstTrailing.child;
final NetworkImage firstNetworkImage = firstImage.image;
expect(firstNetworkImage.url, 'https://www.google.com');
// Second commit
final ListTile secondResult =
tester.widget<ListTile>(listTileFinder.at(1));
expect((secondResult.title as Text).data, '[5678] 5:20 AM');
final CircleAvatar secondTrailing = secondResult.trailing;
final Image secondImage = secondTrailing.child;
final NetworkImage secondNetworkImage = secondImage.image;
expect(secondNetworkImage.url, 'https://about.google');
// Third commit
final ListTile thirdResult =
tester.widget<ListTile>(listTileFinder.at(2));
expect((thirdResult.title as Text).data, '[987654] 11:59 AM');
final CircleAvatar thirdLeading = thirdResult.leading;
expect((thirdLeading.child as Icon).icon, Icons.check);
final CircleAvatar thirdTrailing = thirdResult.trailing;
final Image thirdImage = thirdTrailing.child;
final NetworkImage thirdNetworkImage = thirdImage.image;
expect(thirdNetworkImage.url, 'https://store.google.com');
});
});
}
Future<void> _pumpStatusPageWidget(
WidgetTester tester, StatusPageStatus status) async {
await tester.pumpWidget(MaterialApp(
home: Scaffold(
body: ModelBinding<StatusPageStatus>(
initialModel: status,
child: const StatusPageWidget(
name: 'Random Service Type',
serviceIcon: Icons.people,
url: 'https://store.google.com',
)))));
}
Future<void> _pumpBuildStatusWidget(
WidgetTester tester, BuildStatus status) async {
await tester.pumpWidget(MaterialApp(
home: Scaffold(
body: ModelBinding<BuildStatus>(
initialModel: status, child: const BuildStatusWidget()))));
}
Future<void> _pumpFailingAgentsWidget(
WidgetTester tester, BuildStatus status) async {
await tester.pumpWidget(MaterialApp(
home: Scaffold(
body: ModelBinding<BuildStatus>(
initialModel: status, child: const FailingAgentWidget()))));
}
Future<void> _pumpCommitResultsWidget(
WidgetTester tester, BuildStatus status) async {
await tester.pumpWidget(MaterialApp(
home: Scaffold(
body: ModelBinding<BuildStatus>(
initialModel: status, child: const CommitResultsWidget()))));
}