diff --git a/test/functional/page_objects/time_picker.js b/test/functional/page_objects/time_picker.js
index ef57503236600..679c73dbbff27 100644
--- a/test/functional/page_objects/time_picker.js
+++ b/test/functional/page_objects/time_picker.js
@@ -47,6 +47,18 @@ export function TimePickerPageProvider({ getService, getPageObjects }) {
await find.waitForElementStale(panelElement);
}
+ async setAbsoluteStart(startTime) {
+ await this.showStartEndTimes();
+
+ await testSubjects.click('superDatePickerstartDatePopoverButton');
+ const panel = await this.getTimePickerPanel();
+ await testSubjects.click('superDatePickerAbsoluteTab');
+ await testSubjects.setValue('superDatePickerAbsoluteDateInput', startTime);
+ await testSubjects.click('superDatePickerstartDatePopoverButton');
+ await this.waitPanelIsGone(panel);
+ await PageObjects.header.awaitGlobalLoadingIndicatorHidden();
+ }
+
/**
* @param {String} fromTime YYYY-MM-DD HH:mm:ss.SSS
* @param {String} fromTime YYYY-MM-DD HH:mm:ss.SSS
@@ -110,6 +122,8 @@ export function TimePickerPageProvider({ getService, getPageObjects }) {
}
async showStartEndTimes() {
+ // This first await makes sure the superDatePicker has loaded before we check for the ShowDatesButton
+ await testSubjects.exists('superDatePickerToggleQuickMenuButton', { timeout: 20000 });
const isShowDatesButton = await testSubjects.exists('superDatePickerShowDatesButton');
if (isShowDatesButton) {
await testSubjects.click('superDatePickerShowDatesButton');
diff --git a/x-pack/plugins/uptime/public/components/functional/monitor_list.tsx b/x-pack/plugins/uptime/public/components/functional/monitor_list.tsx
index 4084d516a941e..c3238019b6ec9 100644
--- a/x-pack/plugins/uptime/public/components/functional/monitor_list.tsx
+++ b/x-pack/plugins/uptime/public/components/functional/monitor_list.tsx
@@ -83,7 +83,7 @@ export const MonitorList = ({ dangerColor, loading, monitors, primaryColor }: Mo
defaultMessage: 'ID',
}),
render: (id: string, monitor: LatestMonitor) => (
-
+
{monitor.ping && monitor.ping.monitor && monitor.ping.monitor.name
? monitor.ping.monitor.name
: id}
diff --git a/x-pack/plugins/uptime/public/components/functional/monitor_page_title.tsx b/x-pack/plugins/uptime/public/components/functional/monitor_page_title.tsx
index cd9d8e9fefc2b..b4d4a74a6cd03 100644
--- a/x-pack/plugins/uptime/public/components/functional/monitor_page_title.tsx
+++ b/x-pack/plugins/uptime/public/components/functional/monitor_page_title.tsx
@@ -16,7 +16,7 @@ export const MonitorPageTitle = ({ pageTitle: { name, url, id } }: MonitorPageTi
- {name ? name : url}
+ {name ? name : url}
diff --git a/x-pack/plugins/uptime/public/lib/adapters/framework/kibana_framework_adapter.ts b/x-pack/plugins/uptime/public/lib/adapters/framework/kibana_framework_adapter.ts
index 169d5296ea9e3..2ac2e1044c2da 100644
--- a/x-pack/plugins/uptime/public/lib/adapters/framework/kibana_framework_adapter.ts
+++ b/x-pack/plugins/uptime/public/lib/adapters/framework/kibana_framework_adapter.ts
@@ -45,7 +45,7 @@ export class UMKibanaFrameworkAdapter implements UMFrameworkAdapter {
const route = {
controllerAs: 'uptime',
// @ts-ignore angular
- controller: ($scope, $route, $http, config) => {
+ controller: ($scope, $route, config, $location, $window) => {
const graphQLClient = createGraphQLClient(this.uriPath, this.xsrfHeader);
$scope.$$postDigest(() => {
const elem = document.getElementById('uptimeReactRoot');
@@ -57,6 +57,23 @@ export class UMKibanaFrameworkAdapter implements UMFrameworkAdapter {
const routerBasename = basePath.endsWith('/')
? `${basePath}/${PLUGIN.ROUTER_BASE_NAME}`
: basePath + PLUGIN.ROUTER_BASE_NAME;
+
+ /**
+ * TODO: this is a redirect hack to deal with a problem that largely
+ * in testing but rarely occurs in the real world, where the specified
+ * URL contains `.../app/uptime{SOME_URL_PARAM_TEXT}#` instead of
+ * a path like `.../app/uptime#{SOME_URL_PARAM_TEXT}`.
+ *
+ * This redirect will almost never be triggered in practice, but it makes more
+ * sense to include it here rather than altering the existing testing
+ * infrastructure underlying the rest of Kibana.
+ *
+ * We welcome a more permanent solution that will result in the deletion of the
+ * block below.
+ */
+ if ($location.absUrl().indexOf(PLUGIN.ROUTER_BASE_NAME) === -1) {
+ $window.location.replace(routerBasename);
+ }
const persistedState = this.initializePersistedState();
const darkMode = config.get('theme:darkMode', false) || false;
const {
diff --git a/x-pack/test/functional/apps/uptime/index.ts b/x-pack/test/functional/apps/uptime/index.ts
index ffe0d41d32aa8..3b4e0700de19d 100644
--- a/x-pack/test/functional/apps/uptime/index.ts
+++ b/x-pack/test/functional/apps/uptime/index.ts
@@ -6,11 +6,22 @@
import { KibanaFunctionalTestDefaultProviders } from '../../../types/providers';
+const ARCHIVE = 'uptime/full_heartbeat';
+
// tslint:disable-next-line:no-default-export
-export default ({ loadTestFile }: KibanaFunctionalTestDefaultProviders) => {
+export default ({ loadTestFile, getService }: KibanaFunctionalTestDefaultProviders) => {
+ const esArchiver = getService('esArchiver');
+ const kibanaServer = getService('kibanaServer');
+
describe('Uptime app', function() {
+ before(async () => {
+ await esArchiver.load(ARCHIVE);
+ await kibanaServer.uiSettings.replace({ 'dateFormat:tz': 'UTC' });
+ });
+ after(async () => await esArchiver.unload(ARCHIVE));
this.tags('ciGroup6');
loadTestFile(require.resolve('./overview'));
+ loadTestFile(require.resolve('./monitor'));
});
};
diff --git a/x-pack/test/functional/apps/uptime/monitor.ts b/x-pack/test/functional/apps/uptime/monitor.ts
new file mode 100644
index 0000000000000..7e1cd40d41796
--- /dev/null
+++ b/x-pack/test/functional/apps/uptime/monitor.ts
@@ -0,0 +1,28 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import { KibanaFunctionalTestDefaultProviders } from '../../../types/providers';
+
+// tslint:disable-next-line:no-default-export
+export default ({ getPageObjects, getService }: KibanaFunctionalTestDefaultProviders) => {
+ const esArchiver = getService('esArchiver');
+ const pageObjects = getPageObjects(['uptime']);
+ const archive = 'uptime/full_heartbeat';
+
+ describe('monitor page', () => {
+ before(async () => {
+ await esArchiver.load(archive);
+ });
+ after(async () => await esArchiver.unload(archive));
+ it('loads and displays uptime data based on date range', async () => {
+ await pageObjects.uptime.loadDataAndGoToMonitorPage(
+ '2019-01-28 12:40:08.078',
+ 'auto-http-0X131221E73F825974',
+ 'https://www.google.com/'
+ );
+ });
+ });
+};
diff --git a/x-pack/test/functional/apps/uptime/overview.ts b/x-pack/test/functional/apps/uptime/overview.ts
index 793b55a3d8cee..5379dd9fd68da 100644
--- a/x-pack/test/functional/apps/uptime/overview.ts
+++ b/x-pack/test/functional/apps/uptime/overview.ts
@@ -7,20 +7,15 @@
import { KibanaFunctionalTestDefaultProviders } from '../../../types/providers';
// tslint:disable-next-line:no-default-export
-export default ({ getPageObjects, getService }: KibanaFunctionalTestDefaultProviders) => {
- const esArchiver = getService('esArchiver');
+export default ({ getPageObjects }: KibanaFunctionalTestDefaultProviders) => {
// TODO: add UI functional tests
- // const pageObjects = getPageObjects(['uptime']);
- const archive = 'uptime/full_heartbeat';
-
- describe('Overview page', () => {
- describe('this is a simple test', () => {
- beforeEach(async () => {
- await esArchiver.load(archive);
- });
- afterEach(async () => await esArchiver.unload(archive));
-
- // TODO: add UI functional tests
+ const pageObjects = getPageObjects(['uptime']);
+ describe('overview page', () => {
+ it('loads and displays uptime data based on date range', async () => {
+ await pageObjects.uptime.goToUptimeOverviewAndLoadData(
+ '2019-01-28 12:40:08.078',
+ 'monitor-page-link-auto-http-0X131221E73F825974'
+ );
});
});
};
diff --git a/x-pack/test/functional/page_objects/uptime_page.ts b/x-pack/test/functional/page_objects/uptime_page.ts
index de5470f60bc3a..d0ad3259247fd 100644
--- a/x-pack/test/functional/page_objects/uptime_page.ts
+++ b/x-pack/test/functional/page_objects/uptime_page.ts
@@ -10,13 +10,30 @@ export const UptimePageProvider = ({
getPageObjects,
getService,
}: KibanaFunctionalTestDefaultProviders) => {
- const pageObject = getPageObjects(['common']);
+ const pageObjects = getPageObjects(['common', 'timePicker']);
const uptimeService = getService('uptime');
- return {
- async goToUptimeOverview() {
- await pageObject.common.navigateToApp('uptime');
- await uptimeService.assertExists();
- },
- };
+ return new class UptimePage {
+ public async goToUptimeOverviewAndLoadData(
+ datePickerStartValue: string,
+ monitorIdToCheck: string
+ ) {
+ await pageObjects.common.navigateToApp('uptime');
+ await pageObjects.timePicker.setAbsoluteStart(datePickerStartValue);
+ await uptimeService.monitorIdExists(monitorIdToCheck);
+ }
+
+ public async loadDataAndGoToMonitorPage(
+ datePickerStartValue: string,
+ monitorId: string,
+ monitorName: string
+ ) {
+ await pageObjects.common.navigateToApp('uptime');
+ await pageObjects.timePicker.setAbsoluteStart(datePickerStartValue);
+ await uptimeService.navigateToMonitorWithId(monitorId);
+ if ((await uptimeService.getMonitorNameDisplayedOnPageTitle()) !== monitorName) {
+ throw new Error('Expected monitor name not found');
+ }
+ }
+ }();
};
diff --git a/x-pack/test/functional/services/uptime.ts b/x-pack/test/functional/services/uptime.ts
index ba959db070bb0..a97c43abb0127 100644
--- a/x-pack/test/functional/services/uptime.ts
+++ b/x-pack/test/functional/services/uptime.ts
@@ -8,12 +8,20 @@ import { KibanaFunctionalTestDefaultProviders } from '../../types/providers';
export const UptimeProvider = ({ getService }: KibanaFunctionalTestDefaultProviders) => {
const testSubjects = getService('testSubjects');
-
return {
async assertExists(key: string) {
if (!(await testSubjects.exists(key))) {
throw new Error(`Couldn't find expected element with key "${key}".`);
}
},
+ async monitorIdExists(key: string) {
+ await testSubjects.existOrFail(key);
+ },
+ async navigateToMonitorWithId(monitorId: string) {
+ await testSubjects.click(`monitor-page-link-${monitorId}`);
+ },
+ async getMonitorNameDisplayedOnPageTitle() {
+ return await testSubjects.getVisibleText('monitor-page-title');
+ },
};
};
diff --git a/x-pack/test/types/providers.ts b/x-pack/test/types/providers.ts
index 9699775428a5c..2d655b8176807 100644
--- a/x-pack/test/types/providers.ts
+++ b/x-pack/test/types/providers.ts
@@ -5,9 +5,11 @@
*/
import { EsArchiver } from '../../../src/es_archiver';
+import { UptimeProvider } from '../functional/services/uptime';
export interface KibanaFunctionalTestDefaultProviders {
getService(serviceName: 'esArchiver'): EsArchiver;
+ getService(serviceName: 'uptime'): ReturnType;
getService(serviceName: string): any;
getPageObjects(pageObjectNames: string[]): any;
loadTestFile(path: string): void;