2018-03-17 18:26:18 +05:30
|
|
|
import Clusters from '~/clusters/clusters_bundle';
|
|
|
|
import {
|
|
|
|
REQUEST_LOADING,
|
|
|
|
REQUEST_SUCCESS,
|
|
|
|
REQUEST_FAILURE,
|
2018-11-18 11:00:15 +05:30
|
|
|
APPLICATION_STATUS,
|
2018-03-17 18:26:18 +05:30
|
|
|
} from '~/clusters/constants';
|
2018-03-27 19:54:05 +05:30
|
|
|
import getSetTimeoutPromise from 'spec/helpers/set_timeout_promise_helper';
|
2018-03-17 18:26:18 +05:30
|
|
|
|
|
|
|
describe('Clusters', () => {
|
|
|
|
let cluster;
|
|
|
|
preloadFixtures('clusters/show_cluster.html.raw');
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
loadFixtures('clusters/show_cluster.html.raw');
|
|
|
|
cluster = new Clusters();
|
|
|
|
});
|
|
|
|
|
|
|
|
afterEach(() => {
|
|
|
|
cluster.destroy();
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('toggle', () => {
|
|
|
|
it('should update the button and the input field on click', (done) => {
|
|
|
|
const toggleButton = document.querySelector('.js-cluster-enable-toggle-area .js-project-feature-toggle');
|
|
|
|
const toggleInput = document.querySelector('.js-cluster-enable-toggle-area .js-project-feature-toggle-input');
|
|
|
|
|
|
|
|
toggleButton.click();
|
|
|
|
|
|
|
|
getSetTimeoutPromise()
|
|
|
|
.then(() => {
|
|
|
|
expect(
|
|
|
|
toggleButton.classList,
|
|
|
|
).not.toContain('is-checked');
|
|
|
|
|
|
|
|
expect(
|
|
|
|
toggleInput.getAttribute('value'),
|
|
|
|
).toEqual('false');
|
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('showToken', () => {
|
2018-11-18 11:00:15 +05:30
|
|
|
it('should update token field type', () => {
|
2018-03-17 18:26:18 +05:30
|
|
|
cluster.showTokenButton.click();
|
2018-11-18 11:00:15 +05:30
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
expect(
|
|
|
|
cluster.tokenField.getAttribute('type'),
|
|
|
|
).toEqual('text');
|
|
|
|
|
|
|
|
cluster.showTokenButton.click();
|
2018-11-18 11:00:15 +05:30
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
expect(
|
|
|
|
cluster.tokenField.getAttribute('type'),
|
|
|
|
).toEqual('password');
|
|
|
|
});
|
2018-11-18 11:00:15 +05:30
|
|
|
|
|
|
|
it('should update show token button text', () => {
|
|
|
|
cluster.showTokenButton.click();
|
|
|
|
|
|
|
|
expect(
|
|
|
|
cluster.showTokenButton.textContent,
|
|
|
|
).toEqual('Hide');
|
|
|
|
|
|
|
|
cluster.showTokenButton.click();
|
|
|
|
|
|
|
|
expect(
|
|
|
|
cluster.showTokenButton.textContent,
|
|
|
|
).toEqual('Show');
|
|
|
|
});
|
2018-03-17 18:26:18 +05:30
|
|
|
});
|
|
|
|
|
|
|
|
describe('checkForNewInstalls', () => {
|
|
|
|
const INITIAL_APP_MAP = {
|
|
|
|
helm: { status: null, title: 'Helm Tiller' },
|
|
|
|
ingress: { status: null, title: 'Ingress' },
|
|
|
|
runner: { status: null, title: 'GitLab Runner' },
|
|
|
|
};
|
|
|
|
|
|
|
|
it('does not show alert when things transition from initial null state to something', () => {
|
|
|
|
cluster.checkForNewInstalls(INITIAL_APP_MAP, {
|
|
|
|
...INITIAL_APP_MAP,
|
2018-11-18 11:00:15 +05:30
|
|
|
helm: { status: APPLICATION_STATUS.INSTALLABLE, title: 'Helm Tiller' },
|
2018-03-17 18:26:18 +05:30
|
|
|
});
|
|
|
|
|
|
|
|
const flashMessage = document.querySelector('.js-cluster-application-notice .flash-text');
|
|
|
|
expect(flashMessage).toBeNull();
|
|
|
|
});
|
|
|
|
|
|
|
|
it('shows an alert when something gets newly installed', () => {
|
|
|
|
cluster.checkForNewInstalls({
|
|
|
|
...INITIAL_APP_MAP,
|
2018-11-18 11:00:15 +05:30
|
|
|
helm: { status: APPLICATION_STATUS.INSTALLING, title: 'Helm Tiller' },
|
2018-03-17 18:26:18 +05:30
|
|
|
}, {
|
|
|
|
...INITIAL_APP_MAP,
|
2018-11-18 11:00:15 +05:30
|
|
|
helm: { status: APPLICATION_STATUS.INSTALLED, title: 'Helm Tiller' },
|
2018-03-17 18:26:18 +05:30
|
|
|
});
|
|
|
|
|
|
|
|
const flashMessage = document.querySelector('.js-cluster-application-notice .flash-text');
|
|
|
|
expect(flashMessage).not.toBeNull();
|
|
|
|
expect(flashMessage.textContent.trim()).toEqual('Helm Tiller was successfully installed on your Kubernetes cluster');
|
|
|
|
});
|
|
|
|
|
|
|
|
it('shows an alert when multiple things gets newly installed', () => {
|
|
|
|
cluster.checkForNewInstalls({
|
|
|
|
...INITIAL_APP_MAP,
|
2018-11-18 11:00:15 +05:30
|
|
|
helm: { status: APPLICATION_STATUS.INSTALLING, title: 'Helm Tiller' },
|
|
|
|
ingress: { status: APPLICATION_STATUS.INSTALLABLE, title: 'Ingress' },
|
2018-03-17 18:26:18 +05:30
|
|
|
}, {
|
|
|
|
...INITIAL_APP_MAP,
|
2018-11-18 11:00:15 +05:30
|
|
|
helm: { status: APPLICATION_STATUS.INSTALLED, title: 'Helm Tiller' },
|
|
|
|
ingress: { status: APPLICATION_STATUS.INSTALLED, title: 'Ingress' },
|
2018-03-17 18:26:18 +05:30
|
|
|
});
|
|
|
|
|
|
|
|
const flashMessage = document.querySelector('.js-cluster-application-notice .flash-text');
|
|
|
|
expect(flashMessage).not.toBeNull();
|
|
|
|
expect(flashMessage.textContent.trim()).toEqual('Helm Tiller, Ingress was successfully installed on your Kubernetes cluster');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('updateContainer', () => {
|
|
|
|
describe('when creating cluster', () => {
|
|
|
|
it('should show the creating container', () => {
|
|
|
|
cluster.updateContainer(null, 'creating');
|
|
|
|
|
|
|
|
expect(
|
|
|
|
cluster.creatingContainer.classList.contains('hidden'),
|
|
|
|
).toBeFalsy();
|
|
|
|
expect(
|
|
|
|
cluster.successContainer.classList.contains('hidden'),
|
|
|
|
).toBeTruthy();
|
|
|
|
expect(
|
|
|
|
cluster.errorContainer.classList.contains('hidden'),
|
|
|
|
).toBeTruthy();
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should continue to show `creating` banner with subsequent updates of the same status', () => {
|
|
|
|
cluster.updateContainer('creating', 'creating');
|
|
|
|
|
|
|
|
expect(
|
|
|
|
cluster.creatingContainer.classList.contains('hidden'),
|
|
|
|
).toBeFalsy();
|
|
|
|
expect(
|
|
|
|
cluster.successContainer.classList.contains('hidden'),
|
|
|
|
).toBeTruthy();
|
|
|
|
expect(
|
|
|
|
cluster.errorContainer.classList.contains('hidden'),
|
|
|
|
).toBeTruthy();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('when cluster is created', () => {
|
|
|
|
it('should show the success container and fresh the page', () => {
|
|
|
|
cluster.updateContainer(null, 'created');
|
|
|
|
|
|
|
|
expect(
|
|
|
|
cluster.creatingContainer.classList.contains('hidden'),
|
|
|
|
).toBeTruthy();
|
|
|
|
expect(
|
|
|
|
cluster.successContainer.classList.contains('hidden'),
|
|
|
|
).toBeFalsy();
|
|
|
|
expect(
|
|
|
|
cluster.errorContainer.classList.contains('hidden'),
|
|
|
|
).toBeTruthy();
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should not show a banner when status is already `created`', () => {
|
|
|
|
cluster.updateContainer('created', 'created');
|
|
|
|
|
|
|
|
expect(
|
|
|
|
cluster.creatingContainer.classList.contains('hidden'),
|
|
|
|
).toBeTruthy();
|
|
|
|
expect(
|
|
|
|
cluster.successContainer.classList.contains('hidden'),
|
|
|
|
).toBeTruthy();
|
|
|
|
expect(
|
|
|
|
cluster.errorContainer.classList.contains('hidden'),
|
|
|
|
).toBeTruthy();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('when cluster has error', () => {
|
|
|
|
it('should show the error container', () => {
|
|
|
|
cluster.updateContainer(null, 'errored', 'this is an error');
|
|
|
|
|
|
|
|
expect(
|
|
|
|
cluster.creatingContainer.classList.contains('hidden'),
|
|
|
|
).toBeTruthy();
|
|
|
|
expect(
|
|
|
|
cluster.successContainer.classList.contains('hidden'),
|
|
|
|
).toBeTruthy();
|
|
|
|
expect(
|
|
|
|
cluster.errorContainer.classList.contains('hidden'),
|
|
|
|
).toBeFalsy();
|
|
|
|
|
|
|
|
expect(
|
|
|
|
cluster.errorReasonContainer.textContent,
|
|
|
|
).toContain('this is an error');
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should show `error` banner when previously `creating`', () => {
|
|
|
|
cluster.updateContainer('creating', 'errored');
|
|
|
|
|
|
|
|
expect(
|
|
|
|
cluster.creatingContainer.classList.contains('hidden'),
|
|
|
|
).toBeTruthy();
|
|
|
|
expect(
|
|
|
|
cluster.successContainer.classList.contains('hidden'),
|
|
|
|
).toBeTruthy();
|
|
|
|
expect(
|
|
|
|
cluster.errorContainer.classList.contains('hidden'),
|
|
|
|
).toBeFalsy();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('installApplication', () => {
|
|
|
|
it('tries to install helm', (done) => {
|
|
|
|
spyOn(cluster.service, 'installApplication').and.returnValue(Promise.resolve());
|
|
|
|
expect(cluster.store.state.applications.helm.requestStatus).toEqual(null);
|
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
cluster.installApplication({ id: 'helm' });
|
2018-03-17 18:26:18 +05:30
|
|
|
|
|
|
|
expect(cluster.store.state.applications.helm.requestStatus).toEqual(REQUEST_LOADING);
|
|
|
|
expect(cluster.store.state.applications.helm.requestReason).toEqual(null);
|
2018-11-08 19:23:39 +05:30
|
|
|
expect(cluster.service.installApplication).toHaveBeenCalledWith('helm', undefined);
|
2018-03-17 18:26:18 +05:30
|
|
|
|
|
|
|
getSetTimeoutPromise()
|
|
|
|
.then(() => {
|
|
|
|
expect(cluster.store.state.applications.helm.requestStatus).toEqual(REQUEST_SUCCESS);
|
|
|
|
expect(cluster.store.state.applications.helm.requestReason).toEqual(null);
|
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('tries to install ingress', (done) => {
|
|
|
|
spyOn(cluster.service, 'installApplication').and.returnValue(Promise.resolve());
|
|
|
|
expect(cluster.store.state.applications.ingress.requestStatus).toEqual(null);
|
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
cluster.installApplication({ id: 'ingress' });
|
2018-03-17 18:26:18 +05:30
|
|
|
|
|
|
|
expect(cluster.store.state.applications.ingress.requestStatus).toEqual(REQUEST_LOADING);
|
|
|
|
expect(cluster.store.state.applications.ingress.requestReason).toEqual(null);
|
2018-11-08 19:23:39 +05:30
|
|
|
expect(cluster.service.installApplication).toHaveBeenCalledWith('ingress', undefined);
|
2018-03-17 18:26:18 +05:30
|
|
|
|
|
|
|
getSetTimeoutPromise()
|
|
|
|
.then(() => {
|
|
|
|
expect(cluster.store.state.applications.ingress.requestStatus).toEqual(REQUEST_SUCCESS);
|
|
|
|
expect(cluster.store.state.applications.ingress.requestReason).toEqual(null);
|
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('tries to install runner', (done) => {
|
|
|
|
spyOn(cluster.service, 'installApplication').and.returnValue(Promise.resolve());
|
|
|
|
expect(cluster.store.state.applications.runner.requestStatus).toEqual(null);
|
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
cluster.installApplication({ id: 'runner' });
|
2018-03-17 18:26:18 +05:30
|
|
|
|
|
|
|
expect(cluster.store.state.applications.runner.requestStatus).toEqual(REQUEST_LOADING);
|
|
|
|
expect(cluster.store.state.applications.runner.requestReason).toEqual(null);
|
2018-11-08 19:23:39 +05:30
|
|
|
expect(cluster.service.installApplication).toHaveBeenCalledWith('runner', undefined);
|
2018-03-17 18:26:18 +05:30
|
|
|
|
|
|
|
getSetTimeoutPromise()
|
|
|
|
.then(() => {
|
|
|
|
expect(cluster.store.state.applications.runner.requestStatus).toEqual(REQUEST_SUCCESS);
|
|
|
|
expect(cluster.store.state.applications.runner.requestReason).toEqual(null);
|
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
it('tries to install jupyter', (done) => {
|
|
|
|
spyOn(cluster.service, 'installApplication').and.returnValue(Promise.resolve());
|
|
|
|
expect(cluster.store.state.applications.jupyter.requestStatus).toEqual(null);
|
|
|
|
cluster.installApplication({ id: 'jupyter', params: { hostname: cluster.store.state.applications.jupyter.hostname } });
|
|
|
|
|
|
|
|
expect(cluster.store.state.applications.jupyter.requestStatus).toEqual(REQUEST_LOADING);
|
|
|
|
expect(cluster.store.state.applications.jupyter.requestReason).toEqual(null);
|
|
|
|
expect(cluster.service.installApplication).toHaveBeenCalledWith('jupyter', { hostname: cluster.store.state.applications.jupyter.hostname });
|
|
|
|
|
|
|
|
getSetTimeoutPromise()
|
|
|
|
.then(() => {
|
|
|
|
expect(cluster.store.state.applications.jupyter.requestStatus).toEqual(REQUEST_SUCCESS);
|
|
|
|
expect(cluster.store.state.applications.jupyter.requestReason).toEqual(null);
|
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
it('sets error request status when the request fails', (done) => {
|
|
|
|
spyOn(cluster.service, 'installApplication').and.returnValue(Promise.reject(new Error('STUBBED ERROR')));
|
|
|
|
expect(cluster.store.state.applications.helm.requestStatus).toEqual(null);
|
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
cluster.installApplication({ id: 'helm' });
|
2018-03-17 18:26:18 +05:30
|
|
|
|
|
|
|
expect(cluster.store.state.applications.helm.requestStatus).toEqual(REQUEST_LOADING);
|
|
|
|
expect(cluster.store.state.applications.helm.requestReason).toEqual(null);
|
|
|
|
expect(cluster.service.installApplication).toHaveBeenCalled();
|
|
|
|
|
|
|
|
getSetTimeoutPromise()
|
|
|
|
.then(() => {
|
|
|
|
expect(cluster.store.state.applications.helm.requestStatus).toEqual(REQUEST_FAILURE);
|
|
|
|
expect(cluster.store.state.applications.helm.requestReason).toBeDefined();
|
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|