blob: 2e5f105e0d6c4d662d34d35c5e268d58ccf12881 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var App = require('app');
var testHelpers = require('test/helpers');
require('utils/polling');
describe('App.Poll', function () {
var poll;
beforeEach(function () {
poll = App.Poll.create();
});
describe('#isCompleted', function () {
var cases = [
{
isError: true,
isSuccess: false,
isCompleted: true,
title: 'error'
},
{
isError: false,
isSuccess: true,
isCompleted: true,
title: 'success'
},
{
isError: false,
isSuccess: false,
isCompleted: false,
title: 'incomplete'
}
];
cases.forEach(function (item) {
it(item.title, function () {
poll.setProperties({
isError: item.isError,
isSuccess: item.isSuccess
});
expect(poll.get('isCompleted')).to.equal(item.isCompleted);
});
});
});
describe('#showLink', function () {
var cases = [
{
isPolling: true,
isStarted: false,
showLink: true,
title: 'polling'
},
{
isPolling: false,
isStarted: true,
showLink: true,
title: 'started'
},
{
isPolling: false,
isStarted: false,
showLink: false,
title: 'not polling, not started'
}
];
cases.forEach(function (item) {
it(item.title, function () {
poll.setProperties({
isPolling: item.isPolling,
isStarted: item.isStarted
});
expect(poll.get('showLink')).to.equal(item.showLink);
});
});
});
describe('#start', function () {
var cases = [
{
setRequestIdCallCount: 1,
startPollingCallCount: 0,
title: 'request id not defined'
},
{
requestId: null,
setRequestIdCallCount: 1,
startPollingCallCount: 0,
title: 'request id is null'
},
{
requestId: 0,
setRequestIdCallCount: 0,
startPollingCallCount: 1,
title: 'request id is zero'
},
{
requestId: 1,
setRequestIdCallCount: 0,
startPollingCallCount: 1,
title: 'request id is non-zero'
}
];
cases.forEach(function (item) {
describe(item.title, function () {
beforeEach(function () {
sinon.stub(poll, 'setRequestId', Em.K);
sinon.stub(poll, 'startPolling', Em.K);
poll.set('requestId', item.requestId);
poll.start();
});
afterEach(function () {
poll.setRequestId.restore();
poll.startPolling.restore();
});
it('set request id', function () {
expect(poll.setRequestId.callCount).to.equal(item.setRequestIdCallCount);
});
it('start polling', function () {
expect(poll.startPolling.callCount).to.equal(item.startPollingCallCount);
});
});
});
});
describe('#setRequestId', function () {
var ajaxObj;
beforeEach(function () {
$.ajax.restore();
sinon.stub($, 'ajax', function (obj) {
return obj;
});
});
it('AJAX request parameters', function () {
var ajaxProps = {
url: '/default',
data: {}
};
poll.setProperties(ajaxProps);
poll.setRequestId();
ajaxObj = $.ajax.firstCall.args[0];
expect(Em.Object.create(ajaxObj).getProperties(['url', 'data'])).to.eql(ajaxProps);
});
describe('#success', function () {
var cases = [
{
data: undefined,
isSuccess: true,
isError: false,
requestId: 1,
doPollingCallCount: 0,
title: 'data not defined'
},
{
data: 'null',
isSuccess: true,
isError: false,
requestId: 1,
doPollingCallCount: 0,
title: 'null data'
},
{
data: '',
isSuccess: true,
isError: false,
requestId: 1,
doPollingCallCount: 0,
title: 'empty data'
},
{
data: '{}',
isSuccess: false,
isError: true,
requestId: undefined,
doPollingCallCount: 1,
title: 'empty object'
},
{
data: '{"Requests":null}',
isSuccess: false,
isError: true,
requestId: null,
doPollingCallCount: 1,
title: 'no requests info'
},
{
data: '{"Requests":{}}',
isSuccess: false,
isError: true,
requestId: undefined,
doPollingCallCount: 1,
title: 'empty requests info'
},
{
data: '{"Requests":{"name":"r0"}}',
isSuccess: false,
isError: true,
requestId: undefined,
doPollingCallCount: 1,
title: 'no request id'
},
{
data: '{"Requests":{"id":0}}',
isSuccess: false,
isError: true,
requestId: 0,
doPollingCallCount: 1,
title: 'request id available'
}
];
cases.forEach(function (item) {
describe(item.title, function () {
var ajaxObject;
beforeEach(function () {
sinon.stub(poll, 'doPolling', Em.K);
poll.setProperties({
isSuccess: false,
isError: true,
requestId: 1
});
poll.setRequestId();
ajaxObject = $.ajax.firstCall.args[0];
ajaxObject.success(item.data);
});
afterEach(function () {
poll.doPolling.restore();
});
it('isSuccess', function () {
expect(poll.get('isSuccess')).to.equal(item.isSuccess);
});
it('isError', function () {
expect(poll.get('isError')).to.equal(item.isError);
});
it('requestId', function () {
expect(poll.get('requestId')).to.equal(item.requestId);
});
it('doPolling call', function () {
expect(poll.doPolling.callCount).to.equal(item.doPollingCallCount);
});
});
});
});
describe('#error', function () {
beforeEach(function () {
poll.setProperties({
isSuccess: true,
isError: false
});
poll.setRequestId();
ajaxObj = $.ajax.firstCall.args[0];
ajaxObj.error();
});
it('isSuccess', function () {
expect(poll.get('isSuccess')).to.be.false;
});
it('isError', function () {
expect(poll.get('isError')).to.be.true;
});
});
});
describe('#updateTaskLog', function () {
beforeEach(function () {
sinon.stub(poll, 'pollTaskLog', Em.K);
poll.set('currentTaskId', 0);
poll.updateTaskLog(1);
});
afterEach(function () {
poll.pollTaskLog.restore();
});
it('should change task id', function () {
expect(poll.get('currentTaskId')).to.equal(1);
});
it('should poll task log', function () {
expect(poll.pollTaskLog.calledOnce).to.be.true;
});
});
describe('#doPolling', function () {
var cases = [
{
requestId: undefined,
startPollingCallCount: 0,
title: 'request id is undefined'
},
{
requestId: null,
startPollingCallCount: 0,
title: 'request id is null'
},
{
requestId: 0,
startPollingCallCount: 1,
title: 'request id is 0'
},
{
requestId: 1,
startPollingCallCount: 1,
title: 'request id is gra than 0'
}
];
beforeEach(function () {
sinon.stub(poll, 'startPolling', Em.K);
});
afterEach(function () {
poll.startPolling.restore();
});
cases.forEach(function (item) {
it(item.title, function () {
poll.set('requestId', item.requestId);
poll.doPolling();
expect(poll.startPolling.callCount).to.equal(item.startPollingCallCount);
});
});
});
describe('#pollTaskLog', function () {
var cases = [
{
currentTaskId: undefined,
ajaxCallArguments: undefined,
title: 'current task id is undefined'
},
{
currentTaskId: null,
ajaxCallArguments: undefined,
title: 'current task id is null'
},
{
currentTaskId: 0,
ajaxCallArguments: [{
name: 'background_operations.get_by_task',
data: {
requestId: 0,
taskId: 0
},
success: 'pollTaskLogSuccessCallback'
}],
title: 'current task id is 0'
},
{
currentTaskId: 1,
ajaxCallArguments: [{
name: 'background_operations.get_by_task',
data: {
requestId: 0,
taskId: 1
},
success: 'pollTaskLogSuccessCallback'
}],
title: 'current task id is more than 0'
}
];
cases.forEach(function (item) {
it(item.title, function () {
poll.setProperties({
requestId: 0,
currentTaskId: item.currentTaskId
});
poll.pollTaskLog();
if (item.ajaxCallArguments) {
item.ajaxCallArguments[0].sender = poll;
}
expect(testHelpers.findAjaxRequest('name', 'background_operations.get_by_task')).to.eql(item.ajaxCallArguments);
});
});
});
describe('#pollTaskLogSuccessCallback', function () {
it('polled data', function () {
poll.set('polledData', [
{
Tasks: {
id: 0
}
},
{
Tasks: {
id: 1
}
},
{
Tasks: {
id: 2
}
}
]);
poll.pollTaskLogSuccessCallback({
Tasks: {
id: 1,
stdout: 'stdout',
stderr: 'stderr'
}
});
expect(poll.get('polledData').toArray()).to.eql([
{
Tasks: {
id: 0
}
},
{
Tasks: {
id: 1,
stdout: 'stdout',
stderr: 'stderr'
}
},
{
Tasks: {
id: 2
}
}
]);
});
});
describe('#startPolling', function () {
var cases = [
{
requestId: undefined,
ajaxCallArguments: undefined,
result: false,
pollTaskLogCallCount: 0,
title: 'request id is undefined'
},
{
requestId: null,
ajaxCallArguments: undefined,
result: false,
pollTaskLogCallCount: 0,
title: 'request id is null'
},
{
requestId: 0,
ajaxCallArguments: [{
name: 'background_operations.get_by_request',
data: {
requestId: 0
},
success: 'reloadSuccessCallback',
error: 'reloadErrorCallback'
}],
result: true,
pollTaskLogCallCount: 1,
title: 'request id is 0'
},
{
requestId: 1,
ajaxCallArguments: [{
name: 'background_operations.get_by_request',
data: {
requestId: 1
},
success: 'reloadSuccessCallback',
error: 'reloadErrorCallback'
}],
result: true,
pollTaskLogCallCount: 1,
title: 'request id is more than 0'
}
];
cases.forEach(function (item) {
var result;
describe(item.title, function () {
beforeEach(function () {
sinon.stub(poll, 'pollTaskLog', Em.K);
poll.set('requestId', item.requestId);
result = poll.startPolling();
if (item.ajaxCallArguments) {
item.ajaxCallArguments[0].sender = poll;
item.ajaxCallArguments[0].data.callback = poll.startPolling;
}
});
afterEach(function () {
poll.pollTaskLog.restore();
});
it('AJAX request', function () {
expect(testHelpers.findAjaxRequest('name', 'background_operations.get_by_request')).to.eql(item.ajaxCallArguments);
});
it('result', function () {
expect(result).to.equal(item.result);
});
it('pollTaskLog', function () {
expect(poll.pollTaskLog.callCount).to.equal(item.pollTaskLogCallCount);
});
});
});
});
describe('#reloadErrorCallback', function () {
var cases = [
{
status: undefined,
isSuccess: false,
isError: false,
title: 'status is undefined'
},
{
status: null,
isSuccess: false,
isError: false,
title: 'status is null'
},
{
status: 0,
isSuccess: false,
isError: false,
title: 'status is 0'
},
{
status: 200,
isSuccess: true,
isError: false,
title: 'success'
},
{
status: 404,
isSuccess: false,
isError: true,
title: 'error'
}
];
cases.forEach(function (item) {
it(item.title, function () {
poll.setProperties({
isSuccess: item.isSuccess,
isError: false
});
poll.reloadErrorCallback({
status: item.status
}, null, null, null, {});
expect(poll.get('isError')).to.equal(item.isError);
});
});
});
describe('#replacePolledData', function () {
var cases = [
{
currentTaskId: undefined,
data: [],
result: [],
title: 'current task id is undefined'
},
{
currentTaskId: null,
data: [],
result: [],
title: 'current task id is null'
},
{
currentTaskId: 0,
polledData: [
{
Tasks: {
id: 0
}
},
{
Tasks: {
id: 1
}
}
],
data: [
{
Tasks: {
id: 1
}
}
],
result: [
{
Tasks: {
id: 1
}
}
],
title: 'current task id is 0, no corresponding task passed'
},
{
currentTaskId: 1,
polledData: [
{
Tasks: {
id: 0
}
}
],
data: [
{
Tasks: {
id: 0
}
},
{
Tasks: {
id: 1
}
}
],
result: [
{
Tasks: {
id: 0
}
},
{
Tasks: {
id: 1
}
}
],
title: 'current task id is more than 0, no corresponding task set'
},
{
currentTaskId: 2,
polledData: [
{
Tasks: {
id: 0
}
},
{
Tasks: {
id: 2,
stdout: 'stdout',
stderr: 'stderr'
}
}
],
data: [
{
Tasks: {
id: 0
}
},
{
Tasks: {
id: 2
}
},
{
Tasks: {
id: 3
}
}
],
result: [
{
Tasks: {
id: 0
}
},
{
Tasks: {
id: 2,
stdout: 'stdout',
stderr: 'stderr'
}
},
{
Tasks: {
id: 3
}
}
],
title: 'current task id is more than 0, corresponding task set and passed'
},
{
currentTaskId: 3,
polledData: [
{
Tasks: {
id: 0
}
}
],
data: [
{
Tasks: {
id: 1
}
}
],
result: [
{
Tasks: {
id: 1
}
}
],
title: 'current task id is more than 0, corresponding task neither set nor passed'
}
];
cases.forEach(function (item) {
it(item.title, function () {
poll.setProperties({
currentTaskId: item.currentTaskId,
polledData: item.polledData || null
});
poll.replacePolledData(item.data);
expect(poll.get('polledData').toArray()).to.eql(item.result);
});
});
});
describe('#calculateProgressByTasks', function () {
var cases = [
{
tasksData: [
{
Tasks: {
status: 'QUEUED'
}
},
{
Tasks: {
status: 'QUEUED'
}
}
],
result: 9,
title: 'all tasks pending'
},
{
tasksData: [
{
Tasks: {
status: 'IN_PROGRESS'
}
},
{
Tasks: {
status: 'IN_PROGRESS'
}
}
],
result: 35,
title: 'all tasks in progress'
},
{
tasksData: [
{
Tasks: {
status: 'COMPLETED'
}
},
{
Tasks: {
status: 'COMPLETED'
}
}
],
result: 100,
title: 'all tasks completed'
},
{
tasksData: [
{
Tasks: {
status: 'FAILED'
}
},
{
Tasks: {
status: 'FAILED'
}
}
],
result: 100,
title: 'all tasks failed'
},
{
tasksData: [
{
Tasks: {
status: 'ABORTED'
}
},
{
Tasks: {
status: 'ABORTED'
}
}
],
result: 100,
title: 'all tasks aborted'
},
{
tasksData: [
{
Tasks: {
status: 'TIMEDOUT'
}
},
{
Tasks: {
status: 'TIMEDOUT'
}
}
],
result: 100,
title: 'all tasks timed out'
},
{
tasksData: [
{
Tasks: {
status: 'QUEUED'
}
},
{
Tasks: {
status: 'COMPLETED'
}
}
],
result: 55,
title: 'pending and finished tasks'
},
{
tasksData: [
{
Tasks: {
status: 'IN_PROGRESS'
}
},
{
Tasks: {
status: 'FAILED'
}
}
],
result: 68,
title: 'running and finished tasks'
},
{
tasksData: [
{
Tasks: {
status: 'IN_PROGRESS'
}
},
{
Tasks: {
status: 'QUEUED'
}
}
],
result: 22,
title: 'running and pending tasks'
},
{
tasksData: [
{
Tasks: {
status: 'IN_PROGRESS'
}
},
{
Tasks: {
status: 'QUEUED'
}
},
{
Tasks: {
status: 'ABORTED'
}
}
],
result: 48,
title: 'running, pending and finished tasks'
}
];
cases.forEach(function (item) {
it(item.title, function () {
expect(poll.calculateProgressByTasks(item.tasksData)).to.equal(item.result);
});
});
});
describe('#isPollingFinished', function () {
var cases = [
{
polledData: [
{
Tasks: {
status: 'QUEUED'
}
},
{
Tasks: {
status: 'COMPLETED'
}
}
],
isPollingFinished: false,
isSuccess: false,
isError: false,
title: 'some queued tasks'
},
{
polledData: [
{
Tasks: {
status: 'IN_PROGRESS'
}
},
{
Tasks: {
status: 'COMPLETED'
}
}
],
isPollingFinished: false,
isSuccess: false,
isError: false,
title: 'some running tasks'
},
{
polledData: [
{
Tasks: {
status: 'PENDING'
}
},
{
Tasks: {
status: 'COMPLETED'
}
}
],
isPollingFinished: false,
isSuccess: false,
isError: false,
title: 'some pending tasks'
},
{
polledData: [
{
Tasks: {
status: 'FAILED'
}
},
{
Tasks: {
status: 'COMPLETED'
}
}
],
isPollingFinished: true,
isSuccess: false,
isError: true,
title: 'all tasks finished, some failed'
},
{
polledData: [
{
Tasks: {
status: 'ABORTED'
}
},
{
Tasks: {
status: 'COMPLETED'
}
}
],
isPollingFinished: true,
isSuccess: false,
isError: true,
title: 'all tasks finished, some aborted'
},
{
polledData: [
{
Tasks: {
status: 'ABORTED'
}
},
{
Tasks: {
status: 'COMPLETED'
}
}
],
isPollingFinished: true,
isSuccess: false,
isError: true,
title: 'all tasks finished, some timed out'
},
{
polledData: [
{
Tasks: {
status: 'COMPLETED'
}
},
{
Tasks: {
status: 'COMPLETED'
}
}
],
isPollingFinished: true,
isSuccess: true,
isError: false,
title: 'all tasks finished successfully'
}
];
cases.forEach(function (item) {
describe(item.title, function () {
var result;
beforeEach(function () {
poll.setProperties({
isSuccess: false,
isError: false
});
result = poll.isPollingFinished(item.polledData);
});
it('isPollingFinished', function () {
expect(result).to.equal(item.isPollingFinished);
});
it('isSuccess', function () {
expect(poll.get('isSuccess')).to.equal(item.isSuccess);
});
it('isError', function () {
expect(poll.get('isError')).to.equal(item.isError);
});
});
});
});
describe('#parseInfo', function () {
var cases = [
{
polledData: {
Requests: {
id: 1
}
},
replacePolledDataCallCount: 0,
progress: '0',
result: false,
title: 'no corresponding request data'
},
{
polledData: {
tasks: []
},
replacePolledDataCallCount: 1,
progress: '100',
result: false,
title: 'no request id info'
},
{
polledData: {
Requests: {
id: 0
},
tasks: []
},
replacePolledDataCallCount: 1,
progress: '100',
result: false,
title: 'no tasks'
},
{
polledData: {
Requests: {
id: 0
},
tasks: [
{
Tasks: {
status: 'PENDING'
}
},
{
Tasks: {
status: 'COMPLETED'
}
}
]
},
replacePolledDataCallCount: 1,
progress: '100',
result: false,
title: 'not all tasks finished'
},
{
polledData: {
Requests: {
id: 0
},
tasks: [
{
Tasks: {
status: 'FAILED'
}
},
{
Tasks: {
status: 'COMPLETED'
}
}
]
},
replacePolledDataCallCount: 1,
progress: '100',
result: true,
title: 'all tasks finished'
}
];
cases.forEach(function (item) {
describe(item.title, function () {
var result;
beforeEach(function () {
sinon.stub(poll, 'replacePolledData', Em.K);
sinon.stub(poll, 'calculateProgressByTasks').returns(100);
sinon.stub(poll, 'isPollingFinished', function (data) {
return data.length > 0 && !(data.someProperty('Tasks.status', 'QUEUED') || data.someProperty('Tasks.status', 'IN_PROGRESS')
|| data.someProperty('Tasks.status', 'PENDING'));
});
poll.setProperties({
requestId: 0,
progress: '0'
});
result = poll.parseInfo(item.polledData);
});
afterEach(function () {
poll.replacePolledData.restore();
poll.calculateProgressByTasks.restore();
poll.isPollingFinished.restore();
});
it('replacePolledData call', function () {
expect(poll.replacePolledData.callCount).to.equal(item.replacePolledDataCallCount);
});
if (item.replacePolledDataCallCount) {
it('replacePolledData argument', function () {
expect(poll.replacePolledData.firstCall.args).to.eql([item.polledData.tasks]);
});
}
it('progress', function () {
expect(poll.get('progress')).to.equal(item.progress);
});
it('result', function () {
expect(result).to.equal(item.result);
});
});
});
});
});