diff --git a/CHANGELOG.md b/CHANGELOG.md index bbe24186..c93073f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +2.0.12 +========== +New Features +---------- +- Added `fetchTask` method to `Workspace` + +Maintenance +---------- +- Fix missing Babel dependency + 2.0.11 ========== Bug fixes diff --git a/lib/Workspace.js b/lib/Workspace.js index af496ddc..80d98d44 100644 --- a/lib/Workspace.js +++ b/lib/Workspace.js @@ -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} - 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 diff --git a/lib/data/WorkspaceEntity.js b/lib/data/WorkspaceEntity.js index c0a2356d..836eade7 100644 --- a/lib/data/WorkspaceEntity.js +++ b/lib/data/WorkspaceEntity.js @@ -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'; /** @@ -130,6 +131,18 @@ export default class WorkspaceEntity { return this._getAllTaskQueues(this._getTaskQueuePage(params)); } + /** + * @private + * @param {string} taskSid + * @returns {Promise} + */ + 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 diff --git a/lib/util/WorkspaceRoutes.js b/lib/util/WorkspaceRoutes.js index 06584cab..84c2b78f 100644 --- a/lib/util/WorkspaceRoutes.js +++ b/lib/util/WorkspaceRoutes.js @@ -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 @@ -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') } }; } diff --git a/test/integration/spec/Workspace.js b/test/integration/spec/Workspace.js index a9be9099..a79b5d21 100644 --- a/test/integration/spec/Workspace.js +++ b/test/integration/spec/Workspace.js @@ -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')); @@ -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); + }); }); diff --git a/test/mock/Workspace.js b/test/mock/Workspace.js index 141ba19f..1c122d9d 100644 --- a/test/mock/Workspace.js +++ b/test/mock/Workspace.js @@ -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 +}; diff --git a/test/unit/spec/Workspace.js b/test/unit/spec/Workspace.js index c7bd4089..26d8c353 100644 --- a/test/unit/spec/Workspace.js +++ b/test/unit/spec/Workspace.js @@ -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', () => { @@ -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', () => { diff --git a/types.d.ts b/types.d.ts index 3602d846..1aa14013 100644 --- a/types.d.ts +++ b/types.d.ts @@ -211,6 +211,7 @@ export class Workspace { fetchWorkers(params?: FetchWorkersParams): Promise>; fetchTaskQueue(queueSid: string): Promise; fetchTaskQueues(params?: FetchTaskQueuesParams): Promise>; + fetchTask(taskSid: string): Promise; } export interface Transfers {