Skip to content

Commit dc9f4b2

Browse files
kirilxdGitHub Enterprise
authored and
GitHub Enterprise
committed
FRIDGE-1407 Add fetch task method (#429)
* 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
1 parent 2c0da46 commit dc9f4b2

File tree

8 files changed

+138
-2
lines changed

8 files changed

+138
-2
lines changed

CHANGELOG.md

+10
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
2.0.12
2+
==========
3+
New Features
4+
----------
5+
- Added `fetchTask` method to `Workspace`
6+
7+
Maintenance
8+
----------
9+
- Fix missing Babel dependency
10+
111
2.0.11
212
==========
313
Bug fixes

lib/Workspace.js

+9
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,15 @@ class Workspace {
9696
return this.workspaceEntity.fetchTaskQueues(params).then(() => this.workspaceEntity.TaskQueues);
9797
}
9898

99+
/**
100+
* Fetch Task of this {@link Workspace} by given sid
101+
* @param {string} taskSid - the sid of the task to fetch
102+
* @returns {Promise<import('./Task')>} - A task with given sid
103+
*/
104+
fetchTask(taskSid) {
105+
return this.workspaceEntity.fetchTask(taskSid);
106+
}
107+
99108
/**
100109
* Update token
101110
* @param {string} newToken - The new token that should be used for authentication

lib/data/WorkspaceEntity.js

+14-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import inRange from 'lodash/inRange';
22
import { API_V1, DEFAULT_MAX_WORKERS, DEFAULT_PAGE_SIZE } from '../util/Constants';
33
import WorkerDescriptor from '../descriptors/WorkerDescriptor';
4+
import TaskDescriptor from '../descriptors/TaskDescriptor';
45
import TaskQueueDescriptor from '../descriptors/TaskQueueDescriptor';
56
import WorkerContainer from '../WorkerContainer';
67
import TaskQueue from '../TaskQueue';
78
import Paginator from '../util/Paginator';
89
import Logger from '../util/Logger';
9-
import WorkspaceRoutes, { WORKER_LIST, TASKQUEUE_LIST } from '../util/WorkspaceRoutes';
10+
import WorkspaceRoutes, { WORKER_LIST, TASKQUEUE_LIST, TASK_LIST } from '../util/WorkspaceRoutes';
1011
import path from 'path';
1112

1213
/**
@@ -130,6 +131,18 @@ export default class WorkspaceEntity {
130131
return this._getAllTaskQueues(this._getTaskQueuePage(params));
131132
}
132133

134+
/**
135+
* @private
136+
* @param {string} taskSid
137+
* @returns {Promise<Task>}
138+
*/
139+
fetchTask(taskSid) {
140+
const requestURL = path.join(this._routes.getRoute(TASK_LIST).path, taskSid);
141+
return this._request.get(requestURL, API_V1).then(response => {
142+
return new TaskDescriptor(response);
143+
});
144+
}
145+
133146
/**
134147
* @private
135148
* @param {Paginator} page

lib/util/WorkspaceRoutes.js

+4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import path from 'path';
44

55
export const WORKER_LIST = 'workerList';
66
export const TASKQUEUE_LIST = 'taskQueueList';
7+
export const TASK_LIST = 'taskList';
78

89
/**
910
* @typedef WorkspaceRoutes.routeTypes
@@ -39,6 +40,9 @@ export default class WorkspaceRoutes extends BaseRoutes {
3940
},
4041
[TASKQUEUE_LIST]: {
4142
path: path.join('Workspaces', this.workspaceSid, 'TaskQueues')
43+
},
44+
[TASK_LIST]: {
45+
path: path.join('Workspaces', this.workspaceSid, 'Tasks')
4246
}
4347
};
4448
}

test/integration/spec/Workspace.js

+22
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Workspace } from '../../../lib';
33
import TaskQueue from '../../../lib/TaskQueue';
44
import WorkerContainer from '../../../lib/WorkerContainer';
55
import { buildRegionForEventBridge } from '../../integration_test_setup/IntegrationTestSetupUtils';
6+
import TaskDescriptor from '../../../lib/descriptors/TaskDescriptor';
67

78
const chai = require('chai');
89
chai.use(require('sinon-chai'));
@@ -309,4 +310,25 @@ describe('Workspace', () => {
309310
assert.equal(workersMap.size, 2);
310311
}).timeout(5000);
311312
});
313+
314+
describe('#fetchTasks', () => {
315+
let createdTask;
316+
before(async() => {
317+
createdTask = await envTwilio.createTask(credentials.multiTaskWorkspaceSid, credentials.multiTaskWorkflowSid);
318+
});
319+
320+
it('should fetch task with Sid', async() => {
321+
let taskSid = createdTask.sid;
322+
const task = await workspace.fetchTask(taskSid);
323+
324+
assert.instanceOf(task, TaskDescriptor);
325+
assert.equal(task.sid, taskSid);
326+
}).timeout(5000);
327+
328+
it('should return 404 error if invalid Sid provided', async() => {
329+
const taskPromise = workspace.fetchTask('WT0000000000000000000000000000000000');
330+
331+
await expect(taskPromise).to.be.rejectedWith('Request failed with status code 404');
332+
}).timeout(5000);
333+
});
312334
});

test/mock/Workspace.js

+51
Original file line numberDiff line numberDiff line change
@@ -422,3 +422,54 @@ export const workerList2Page1 = {
422422
after_sid: "WKxx2",
423423
before_sid: null
424424
};
425+
426+
export const taskList = {
427+
contents: [
428+
{
429+
queue_name: 'Sample Queue',
430+
queue_sid: "WQxxx",
431+
workflow_name: 'Default Workflow',
432+
account_sid: "ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
433+
age: 25200,
434+
assignment_status: "pending",
435+
attributes: "{\"body\": \"hello\"}",
436+
date_created: "2014-05-14T18:50:02Z",
437+
date_updated: "2014-05-15T07:26:06Z",
438+
task_queue_entered_date: "2014-05-14T18:50:02Z",
439+
virtual_start_time: "2014-05-14T18:50:02Z",
440+
priority: 0,
441+
reason: "Test Reason",
442+
sid: "WTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
443+
task_queue_sid: "WQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
444+
task_channel_sid: "TCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
445+
task_channel_unique_name: "task-channel",
446+
timeout: 60,
447+
url: "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Tasks/WTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
448+
workflow_sid: "WWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
449+
workspace_sid: "WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
450+
workflow_friendly_name: "Test Workflow",
451+
task_queue_friendly_name: "Test Queue",
452+
ignore_capacity: false,
453+
routing_target: "WKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
454+
addons: "{}",
455+
version: 0,
456+
links: {
457+
task_queue: "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/TaskQueues/WQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
458+
workflow: "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Workflows/WWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
459+
workspace: "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
460+
reservations: "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Tasks/WTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Reservations"
461+
}
462+
}
463+
],
464+
page: 0,
465+
total: 2,
466+
start: 0,
467+
end: 0,
468+
meta: {
469+
list_key: "contents"
470+
},
471+
nextPage: 0,
472+
lastPage: 0,
473+
after_sid: null,
474+
before_sid: null
475+
};

test/unit/spec/Workspace.js

+27-1
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@ chai.use(require('chai-datetime'));
88
chai.should();
99
const sinon = require('sinon');
1010
import { API_V1 } from '../../../lib/util/Constants';
11-
import { taskQueueList, taskQueuesPage0, taskQueuesPage1, workerList, workerListPage0, workerListPage1, workerList2Page0, workerList2Page1 } from '../../mock/Workspace';
11+
import { taskQueueList, taskQueuesPage0, taskQueuesPage1, workerList, workerListPage0, workerListPage1, workerList2Page0, workerList2Page1, taskList } from '../../mock/Workspace';
1212
import { adminToken, token, updatedAdminToken } from '../../mock/Token';
1313
import Request from '../../../lib/util/Request';
1414
import path from 'path';
1515
import TaskQueue from '../../../lib/TaskQueue';
1616
import WorkerContainer from '../../../lib/WorkerContainer';
1717
import Configuration from '../../../lib/util/Configuration';
18+
import TaskDescriptor from '../../../lib/descriptors/TaskDescriptor';
1819

1920
describe('Workspace', () => {
2021

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

254255
});
255256

257+
describe('#fetchTasks', () => {
258+
const requestURL = 'Workspaces/WSxxx/Tasks';
259+
260+
let sandbox;
261+
beforeEach(() => {
262+
sandbox = sinon.sandbox.create();
263+
});
264+
265+
afterEach(() => sandbox.restore());
266+
267+
it('should fetch task with sid', () => {
268+
const workspace = new Workspace(adminToken);
269+
const taskInstance = taskList.contents[0];
270+
const url = path.join(requestURL, taskInstance.sid);
271+
const stub = sandbox.stub(Request.prototype, 'get').withArgs(url, API_V1).returns(Promise.resolve(taskInstance));
272+
273+
return workspace.fetchTask(taskInstance.sid).then(queue => {
274+
expect(queue.sid).to.equal(taskInstance.sid);
275+
expect(queue).to.be.instanceOf(TaskDescriptor);
276+
expect(stub.withArgs(url, API_V1).calledOnce).to.be.true;
277+
});
278+
});
279+
280+
});
281+
256282

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

types.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ export class Workspace {
211211
fetchWorkers(params?: FetchWorkersParams): Promise<Map<string, Worker>>;
212212
fetchTaskQueue(queueSid: string): Promise<TaskQueue>;
213213
fetchTaskQueues(params?: FetchTaskQueuesParams): Promise<Map<string, TaskQueue>>;
214+
fetchTask(taskSid: string): Promise<Task>;
214215
}
215216

216217
export interface Transfers {

0 commit comments

Comments
 (0)