Skip to content

Commit

Permalink
FRIDGE-1407 Add fetch task method (#429)
Browse files Browse the repository at this point in the history
* FRIDGE-1407 Add fetch task method

* FRIDGE-1407 Fix tests

* FRIDGE-1407 Fix tests

* FRIDGE-1407 Remove task container

* FRIDGE-1407 Remove task container

* FRIDGE-1407 Remove task container

* FRIDGE-1407 Add unit tests

* FRIDGE-1407 Fix formatting

* FRIDGE-1407 Fix formatting

* FRIDGE-1407 Fix formatting

* FRIDGE-1407 Update changelog

* Trigger pipeline
  • Loading branch information
kirilxd authored and GitHub Enterprise committed Nov 19, 2024
1 parent 2c0da46 commit dc9f4b2
Show file tree
Hide file tree
Showing 8 changed files with 138 additions and 2 deletions.
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
2.0.12
==========
New Features
----------
- Added `fetchTask` method to `Workspace`

Maintenance
----------
- Fix missing Babel dependency

2.0.11
==========
Bug fixes
Expand Down
9 changes: 9 additions & 0 deletions lib/Workspace.js
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,15 @@ class Workspace {
return this.workspaceEntity.fetchTaskQueues(params).then(() => this.workspaceEntity.TaskQueues);
}

/**
* Fetch Task of this {@link Workspace} by given sid
* @param {string} taskSid - the sid of the task to fetch
* @returns {Promise<import('./Task')>} - A task with given sid
*/
fetchTask(taskSid) {
return this.workspaceEntity.fetchTask(taskSid);
}

/**
* Update token
* @param {string} newToken - The new token that should be used for authentication
Expand Down
15 changes: 14 additions & 1 deletion lib/data/WorkspaceEntity.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import inRange from 'lodash/inRange';
import { API_V1, DEFAULT_MAX_WORKERS, DEFAULT_PAGE_SIZE } from '../util/Constants';
import WorkerDescriptor from '../descriptors/WorkerDescriptor';
import TaskDescriptor from '../descriptors/TaskDescriptor';
import TaskQueueDescriptor from '../descriptors/TaskQueueDescriptor';
import WorkerContainer from '../WorkerContainer';
import TaskQueue from '../TaskQueue';
import Paginator from '../util/Paginator';
import Logger from '../util/Logger';
import WorkspaceRoutes, { WORKER_LIST, TASKQUEUE_LIST } from '../util/WorkspaceRoutes';
import WorkspaceRoutes, { WORKER_LIST, TASKQUEUE_LIST, TASK_LIST } from '../util/WorkspaceRoutes';
import path from 'path';

/**
Expand Down Expand Up @@ -130,6 +131,18 @@ export default class WorkspaceEntity {
return this._getAllTaskQueues(this._getTaskQueuePage(params));
}

/**
* @private
* @param {string} taskSid
* @returns {Promise<Task>}
*/
fetchTask(taskSid) {
const requestURL = path.join(this._routes.getRoute(TASK_LIST).path, taskSid);
return this._request.get(requestURL, API_V1).then(response => {
return new TaskDescriptor(response);
});
}

/**
* @private
* @param {Paginator} page
Expand Down
4 changes: 4 additions & 0 deletions lib/util/WorkspaceRoutes.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import path from 'path';

export const WORKER_LIST = 'workerList';
export const TASKQUEUE_LIST = 'taskQueueList';
export const TASK_LIST = 'taskList';

/**
* @typedef WorkspaceRoutes.routeTypes
Expand Down Expand Up @@ -39,6 +40,9 @@ export default class WorkspaceRoutes extends BaseRoutes {
},
[TASKQUEUE_LIST]: {
path: path.join('Workspaces', this.workspaceSid, 'TaskQueues')
},
[TASK_LIST]: {
path: path.join('Workspaces', this.workspaceSid, 'Tasks')
}
};
}
Expand Down
22 changes: 22 additions & 0 deletions test/integration/spec/Workspace.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Workspace } from '../../../lib';
import TaskQueue from '../../../lib/TaskQueue';
import WorkerContainer from '../../../lib/WorkerContainer';
import { buildRegionForEventBridge } from '../../integration_test_setup/IntegrationTestSetupUtils';
import TaskDescriptor from '../../../lib/descriptors/TaskDescriptor';

const chai = require('chai');
chai.use(require('sinon-chai'));
Expand Down Expand Up @@ -309,4 +310,25 @@ describe('Workspace', () => {
assert.equal(workersMap.size, 2);
}).timeout(5000);
});

describe('#fetchTasks', () => {
let createdTask;
before(async() => {
createdTask = await envTwilio.createTask(credentials.multiTaskWorkspaceSid, credentials.multiTaskWorkflowSid);
});

it('should fetch task with Sid', async() => {
let taskSid = createdTask.sid;
const task = await workspace.fetchTask(taskSid);

assert.instanceOf(task, TaskDescriptor);
assert.equal(task.sid, taskSid);
}).timeout(5000);

it('should return 404 error if invalid Sid provided', async() => {
const taskPromise = workspace.fetchTask('WT0000000000000000000000000000000000');

await expect(taskPromise).to.be.rejectedWith('Request failed with status code 404');
}).timeout(5000);
});
});
51 changes: 51 additions & 0 deletions test/mock/Workspace.js
Original file line number Diff line number Diff line change
Expand Up @@ -422,3 +422,54 @@ export const workerList2Page1 = {
after_sid: "WKxx2",
before_sid: null
};

export const taskList = {
contents: [
{
queue_name: 'Sample Queue',
queue_sid: "WQxxx",
workflow_name: 'Default Workflow',
account_sid: "ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
age: 25200,
assignment_status: "pending",
attributes: "{\"body\": \"hello\"}",
date_created: "2014-05-14T18:50:02Z",
date_updated: "2014-05-15T07:26:06Z",
task_queue_entered_date: "2014-05-14T18:50:02Z",
virtual_start_time: "2014-05-14T18:50:02Z",
priority: 0,
reason: "Test Reason",
sid: "WTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
task_queue_sid: "WQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
task_channel_sid: "TCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
task_channel_unique_name: "task-channel",
timeout: 60,
url: "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Tasks/WTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
workflow_sid: "WWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
workspace_sid: "WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
workflow_friendly_name: "Test Workflow",
task_queue_friendly_name: "Test Queue",
ignore_capacity: false,
routing_target: "WKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
addons: "{}",
version: 0,
links: {
task_queue: "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/TaskQueues/WQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
workflow: "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Workflows/WWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
workspace: "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
reservations: "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Tasks/WTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Reservations"
}
}
],
page: 0,
total: 2,
start: 0,
end: 0,
meta: {
list_key: "contents"
},
nextPage: 0,
lastPage: 0,
after_sid: null,
before_sid: null
};
28 changes: 27 additions & 1 deletion test/unit/spec/Workspace.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@ chai.use(require('chai-datetime'));
chai.should();
const sinon = require('sinon');
import { API_V1 } from '../../../lib/util/Constants';
import { taskQueueList, taskQueuesPage0, taskQueuesPage1, workerList, workerListPage0, workerListPage1, workerList2Page0, workerList2Page1 } from '../../mock/Workspace';
import { taskQueueList, taskQueuesPage0, taskQueuesPage1, workerList, workerListPage0, workerListPage1, workerList2Page0, workerList2Page1, taskList } from '../../mock/Workspace';
import { adminToken, token, updatedAdminToken } from '../../mock/Token';
import Request from '../../../lib/util/Request';
import path from 'path';
import TaskQueue from '../../../lib/TaskQueue';
import WorkerContainer from '../../../lib/WorkerContainer';
import Configuration from '../../../lib/util/Configuration';
import TaskDescriptor from '../../../lib/descriptors/TaskDescriptor';

describe('Workspace', () => {

Expand Down Expand Up @@ -253,6 +254,31 @@ describe('Workspace', () => {

});

describe('#fetchTasks', () => {
const requestURL = 'Workspaces/WSxxx/Tasks';

let sandbox;
beforeEach(() => {
sandbox = sinon.sandbox.create();
});

afterEach(() => sandbox.restore());

it('should fetch task with sid', () => {
const workspace = new Workspace(adminToken);
const taskInstance = taskList.contents[0];
const url = path.join(requestURL, taskInstance.sid);
const stub = sandbox.stub(Request.prototype, 'get').withArgs(url, API_V1).returns(Promise.resolve(taskInstance));

return workspace.fetchTask(taskInstance.sid).then(queue => {
expect(queue.sid).to.equal(taskInstance.sid);
expect(queue).to.be.instanceOf(TaskDescriptor);
expect(stub.withArgs(url, API_V1).calledOnce).to.be.true;
});
});

});


describe('#updateToken', () => {

Expand Down
1 change: 1 addition & 0 deletions types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,7 @@ export class Workspace {
fetchWorkers(params?: FetchWorkersParams): Promise<Map<string, Worker>>;
fetchTaskQueue(queueSid: string): Promise<TaskQueue>;
fetchTaskQueues(params?: FetchTaskQueuesParams): Promise<Map<string, TaskQueue>>;
fetchTask(taskSid: string): Promise<Task>;
}

export interface Transfers {
Expand Down

0 comments on commit dc9f4b2

Please sign in to comment.