smartling-api-sdk-nodejs 2.32.0 → 2.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api/base/base-api.ts +3 -1
- package/api/http/smartling-bare-list-response.ts +5 -0
- package/api/http/smartling-list-response.ts +3 -2
- package/api/issues/dto/create-issue-string-dto.ts +4 -0
- package/api/issues/dto/issue-answered-dto.ts +3 -0
- package/api/issues/dto/issue-assignee-dto.ts +3 -0
- package/api/issues/dto/issue-changed-type-dto.ts +8 -0
- package/api/issues/dto/issue-comment-dto.ts +7 -0
- package/api/issues/dto/issue-dto.ts +30 -0
- package/api/issues/dto/issue-severity-level-dto.ts +5 -0
- package/api/issues/dto/issue-sort-by-dto.ts +5 -0
- package/api/issues/dto/issue-sort-item-dto.ts +7 -0
- package/api/issues/dto/issue-state-dto.ts +6 -0
- package/api/issues/dto/issue-string-dto.ts +4 -0
- package/api/issues/dto/issue-text-dto.ts +4 -0
- package/api/issues/dto/issues-count-dto.ts +3 -0
- package/api/issues/dto/job-filter-dto.ts +6 -0
- package/api/issues/dto/string-filter-dto.ts +4 -0
- package/api/issues/enums/issue-severity-level.ts +5 -0
- package/api/issues/enums/issue-sort-field.ts +14 -0
- package/api/issues/enums/issue-state.ts +4 -0
- package/api/issues/enums/issue-sub-type.ts +10 -0
- package/api/issues/enums/issue-type.ts +4 -0
- package/api/issues/enums/issue-watching-state.ts +4 -0
- package/api/issues/enums/job-filter-presence.ts +4 -0
- package/api/issues/index.ts +238 -0
- package/api/issues/params/base-issues-filter-parameters.ts +102 -0
- package/api/issues/params/count-account-issues-parameters.ts +8 -0
- package/api/issues/params/count-project-issues-parameters.ts +3 -0
- package/api/issues/params/create-issue-comment-parameters.ts +12 -0
- package/api/issues/params/create-issue-parameters.ts +41 -0
- package/api/issues/params/edit-issue-comment-parameters.ts +12 -0
- package/api/issues/params/edit-issue-parameters.ts +12 -0
- package/api/issues/params/find-account-issues-parameters.ts +31 -0
- package/api/issues/params/find-project-issues-parameters.ts +26 -0
- package/api/issues/params/update-issue-answered-parameters.ts +8 -0
- package/api/issues/params/update-issue-assignee-parameters.ts +12 -0
- package/api/issues/params/update-issue-severity-level-parameters.ts +9 -0
- package/api/issues/params/update-issue-state-parameters.ts +9 -0
- package/api/issues/params/update-issue-type-parameters.ts +20 -0
- package/api/vendors/dto/content-assignment-dto.ts +29 -0
- package/api/vendors/dto/workflow-step-type.ts +15 -0
- package/api/vendors/index.ts +23 -0
- package/built/api/base/base-api.js +3 -1
- package/built/api/base/base-api.js.map +1 -1
- package/built/api/http/smartling-bare-list-response.d.ts +4 -0
- package/built/api/http/smartling-bare-list-response.js +3 -0
- package/built/api/http/smartling-bare-list-response.js.map +1 -0
- package/built/api/http/smartling-list-response.d.ts +2 -2
- package/built/api/issues/dto/create-issue-string-dto.d.ts +4 -0
- package/built/api/issues/dto/create-issue-string-dto.js +3 -0
- package/built/api/issues/dto/create-issue-string-dto.js.map +1 -0
- package/built/api/issues/dto/issue-answered-dto.d.ts +3 -0
- package/built/api/issues/dto/issue-answered-dto.js +3 -0
- package/built/api/issues/dto/issue-answered-dto.js.map +1 -0
- package/built/api/issues/dto/issue-assignee-dto.d.ts +3 -0
- package/built/api/issues/dto/issue-assignee-dto.js +3 -0
- package/built/api/issues/dto/issue-assignee-dto.js.map +1 -0
- package/built/api/issues/dto/issue-changed-type-dto.d.ts +7 -0
- package/built/api/issues/dto/issue-changed-type-dto.js +3 -0
- package/built/api/issues/dto/issue-changed-type-dto.js.map +1 -0
- package/built/api/issues/dto/issue-comment-dto.d.ts +7 -0
- package/built/api/issues/dto/issue-comment-dto.js +3 -0
- package/built/api/issues/dto/issue-comment-dto.js.map +1 -0
- package/built/api/issues/dto/issue-dto.d.ts +29 -0
- package/built/api/issues/dto/issue-dto.js +3 -0
- package/built/api/issues/dto/issue-dto.js.map +1 -0
- package/built/api/issues/dto/issue-severity-level-dto.d.ts +4 -0
- package/built/api/issues/dto/issue-severity-level-dto.js +3 -0
- package/built/api/issues/dto/issue-severity-level-dto.js.map +1 -0
- package/built/api/issues/dto/issue-sort-by-dto.d.ts +4 -0
- package/built/api/issues/dto/issue-sort-by-dto.js +3 -0
- package/built/api/issues/dto/issue-sort-by-dto.js.map +1 -0
- package/built/api/issues/dto/issue-sort-item-dto.d.ts +6 -0
- package/built/api/issues/dto/issue-sort-item-dto.js +3 -0
- package/built/api/issues/dto/issue-sort-item-dto.js.map +1 -0
- package/built/api/issues/dto/issue-state-dto.d.ts +5 -0
- package/built/api/issues/dto/issue-state-dto.js +3 -0
- package/built/api/issues/dto/issue-state-dto.js.map +1 -0
- package/built/api/issues/dto/issue-string-dto.d.ts +4 -0
- package/built/api/issues/dto/issue-string-dto.js +3 -0
- package/built/api/issues/dto/issue-string-dto.js.map +1 -0
- package/built/api/issues/dto/issue-text-dto.d.ts +4 -0
- package/built/api/issues/dto/issue-text-dto.js +3 -0
- package/built/api/issues/dto/issue-text-dto.js.map +1 -0
- package/built/api/issues/dto/issues-count-dto.d.ts +3 -0
- package/built/api/issues/dto/issues-count-dto.js +3 -0
- package/built/api/issues/dto/issues-count-dto.js.map +1 -0
- package/built/api/issues/dto/job-filter-dto.d.ts +5 -0
- package/built/api/issues/dto/job-filter-dto.js +3 -0
- package/built/api/issues/dto/job-filter-dto.js.map +1 -0
- package/built/api/issues/dto/string-filter-dto.d.ts +4 -0
- package/built/api/issues/dto/string-filter-dto.js +3 -0
- package/built/api/issues/dto/string-filter-dto.js.map +1 -0
- package/built/api/issues/enums/issue-severity-level.d.ts +5 -0
- package/built/api/issues/enums/issue-severity-level.js +10 -0
- package/built/api/issues/enums/issue-severity-level.js.map +1 -0
- package/built/api/issues/enums/issue-sort-field.d.ts +14 -0
- package/built/api/issues/enums/issue-sort-field.js +19 -0
- package/built/api/issues/enums/issue-sort-field.js.map +1 -0
- package/built/api/issues/enums/issue-state.d.ts +4 -0
- package/built/api/issues/enums/issue-state.js +9 -0
- package/built/api/issues/enums/issue-state.js.map +1 -0
- package/built/api/issues/enums/issue-sub-type.d.ts +10 -0
- package/built/api/issues/enums/issue-sub-type.js +15 -0
- package/built/api/issues/enums/issue-sub-type.js.map +1 -0
- package/built/api/issues/enums/issue-type.d.ts +4 -0
- package/built/api/issues/enums/issue-type.js +9 -0
- package/built/api/issues/enums/issue-type.js.map +1 -0
- package/built/api/issues/enums/issue-watching-state.d.ts +4 -0
- package/built/api/issues/enums/issue-watching-state.js +9 -0
- package/built/api/issues/enums/issue-watching-state.js.map +1 -0
- package/built/api/issues/enums/job-filter-presence.d.ts +4 -0
- package/built/api/issues/enums/job-filter-presence.js +9 -0
- package/built/api/issues/enums/job-filter-presence.js.map +1 -0
- package/built/api/issues/index.d.ts +47 -0
- package/built/api/issues/index.js +112 -0
- package/built/api/issues/index.js.map +1 -0
- package/built/api/issues/params/base-issues-filter-parameters.d.ts +27 -0
- package/built/api/issues/params/base-issues-filter-parameters.js +83 -0
- package/built/api/issues/params/base-issues-filter-parameters.js.map +1 -0
- package/built/api/issues/params/count-account-issues-parameters.d.ts +4 -0
- package/built/api/issues/params/count-account-issues-parameters.js +12 -0
- package/built/api/issues/params/count-account-issues-parameters.js.map +1 -0
- package/built/api/issues/params/count-project-issues-parameters.d.ts +3 -0
- package/built/api/issues/params/count-project-issues-parameters.js +8 -0
- package/built/api/issues/params/count-project-issues-parameters.js.map +1 -0
- package/built/api/issues/params/create-issue-comment-parameters.d.ts +4 -0
- package/built/api/issues/params/create-issue-comment-parameters.js +16 -0
- package/built/api/issues/params/create-issue-comment-parameters.js.map +1 -0
- package/built/api/issues/params/create-issue-parameters.d.ts +13 -0
- package/built/api/issues/params/create-issue-parameters.js +36 -0
- package/built/api/issues/params/create-issue-parameters.js.map +1 -0
- package/built/api/issues/params/edit-issue-comment-parameters.d.ts +4 -0
- package/built/api/issues/params/edit-issue-comment-parameters.js +16 -0
- package/built/api/issues/params/edit-issue-comment-parameters.js.map +1 -0
- package/built/api/issues/params/edit-issue-parameters.d.ts +4 -0
- package/built/api/issues/params/edit-issue-parameters.js +16 -0
- package/built/api/issues/params/edit-issue-parameters.js.map +1 -0
- package/built/api/issues/params/find-account-issues-parameters.d.ts +8 -0
- package/built/api/issues/params/find-account-issues-parameters.js +31 -0
- package/built/api/issues/params/find-account-issues-parameters.js.map +1 -0
- package/built/api/issues/params/find-project-issues-parameters.d.ts +7 -0
- package/built/api/issues/params/find-project-issues-parameters.js +27 -0
- package/built/api/issues/params/find-project-issues-parameters.js.map +1 -0
- package/built/api/issues/params/update-issue-answered-parameters.d.ts +4 -0
- package/built/api/issues/params/update-issue-answered-parameters.js +12 -0
- package/built/api/issues/params/update-issue-answered-parameters.js.map +1 -0
- package/built/api/issues/params/update-issue-assignee-parameters.d.ts +4 -0
- package/built/api/issues/params/update-issue-assignee-parameters.js +16 -0
- package/built/api/issues/params/update-issue-assignee-parameters.js.map +1 -0
- package/built/api/issues/params/update-issue-severity-level-parameters.d.ts +5 -0
- package/built/api/issues/params/update-issue-severity-level-parameters.js +12 -0
- package/built/api/issues/params/update-issue-severity-level-parameters.js.map +1 -0
- package/built/api/issues/params/update-issue-state-parameters.d.ts +5 -0
- package/built/api/issues/params/update-issue-state-parameters.js +12 -0
- package/built/api/issues/params/update-issue-state-parameters.js.map +1 -0
- package/built/api/issues/params/update-issue-type-parameters.d.ts +8 -0
- package/built/api/issues/params/update-issue-type-parameters.js +20 -0
- package/built/api/issues/params/update-issue-type-parameters.js.map +1 -0
- package/built/api/vendors/dto/content-assignment-dto.d.ts +27 -0
- package/built/api/vendors/dto/content-assignment-dto.js +3 -0
- package/built/api/vendors/dto/content-assignment-dto.js.map +1 -0
- package/built/api/vendors/dto/workflow-step-type.d.ts +14 -0
- package/built/api/vendors/dto/workflow-step-type.js +19 -0
- package/built/api/vendors/dto/workflow-step-type.js.map +1 -0
- package/built/api/vendors/index.d.ts +9 -0
- package/built/api/vendors/index.js +27 -0
- package/built/api/vendors/index.js.map +1 -0
- package/built/index.d.ts +41 -0
- package/built/index.js +41 -0
- package/built/index.js.map +1 -1
- package/built/package.json +1 -1
- package/built/test/issues.spec.d.ts +1 -0
- package/built/test/issues.spec.js +513 -0
- package/built/test/issues.spec.js.map +1 -0
- package/built/test/vendors.spec.d.ts +1 -0
- package/built/test/vendors.spec.js +133 -0
- package/built/test/vendors.spec.js.map +1 -0
- package/index.ts +41 -0
- package/package.json +1 -1
- package/test/issues.spec.ts +624 -0
- package/test/vendors.spec.ts +136 -0
|
@@ -0,0 +1,624 @@
|
|
|
1
|
+
import * as sinon from "sinon";
|
|
2
|
+
import * as assert from "assert";
|
|
3
|
+
import { loggerMock, authMock, responseMock } from "./mock";
|
|
4
|
+
import { SmartlingIssuesApi } from "../api/issues/index";
|
|
5
|
+
import { SmartlingAuthApi } from "../api/auth/index";
|
|
6
|
+
import { IssueType } from "../api/issues/enums/issue-type";
|
|
7
|
+
import { IssueSubType } from "../api/issues/enums/issue-sub-type";
|
|
8
|
+
import { IssueSeverityLevel } from "../api/issues/enums/issue-severity-level";
|
|
9
|
+
import { CountProjectIssuesParameters } from "../api/issues/params/count-project-issues-parameters";
|
|
10
|
+
import { JobFilterPresence } from "../api/issues/enums/job-filter-presence";
|
|
11
|
+
import { CreateIssueParameters } from "../api/issues/params/create-issue-parameters";
|
|
12
|
+
import { EditIssueParameters } from "../api/issues/params/edit-issue-parameters";
|
|
13
|
+
import { UpdateIssueStateParameters } from "../api/issues/params/update-issue-state-parameters";
|
|
14
|
+
import { IssueState } from "../api/issues/enums/issue-state";
|
|
15
|
+
import { UpdateIssueAssigneeParameters } from "../api/issues/params/update-issue-assignee-parameters";
|
|
16
|
+
import { CreateIssueCommentParameters } from "../api/issues/params/create-issue-comment-parameters";
|
|
17
|
+
import { EditIssueCommentParameters } from "../api/issues/params/edit-issue-comment-parameters";
|
|
18
|
+
import { FindProjectIssuesParameters } from "../api/issues/params/find-project-issues-parameters";
|
|
19
|
+
import { FindAccountIssuesParameters } from "../api/issues/params/find-account-issues-parameters";
|
|
20
|
+
import { UpdateIssueAnsweredParameters } from "../api/issues/params/update-issue-answered-parameters";
|
|
21
|
+
import { UpdateIssueSeverityLevelParameters } from "../api/issues/params/update-issue-severity-level-parameters";
|
|
22
|
+
import { UpdateIssueTypeParameters } from "../api/issues/params/update-issue-type-parameters";
|
|
23
|
+
import { CountAccountIssuesParameters } from "../api/issues/params/count-account-issues-parameters";
|
|
24
|
+
import { IssueSortField } from "../api/issues/enums/issue-sort-field";
|
|
25
|
+
import { Order } from "../api/parameters/order";
|
|
26
|
+
|
|
27
|
+
describe("SmartlingIssuesAPI class tests.", () => {
|
|
28
|
+
const accountUid = "testAccountUid";
|
|
29
|
+
const projectId = "testProjectId";
|
|
30
|
+
const issueUid = "testIssueUid";
|
|
31
|
+
const issueCommentUid = "testIssueCommentUid";
|
|
32
|
+
let issuesApi;
|
|
33
|
+
let issuesServiceApiFetchStub;
|
|
34
|
+
let issuesServiceApiUaStub;
|
|
35
|
+
let responseMockJsonStub;
|
|
36
|
+
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
issuesApi = new SmartlingIssuesApi(
|
|
39
|
+
"https://test.com",
|
|
40
|
+
authMock as unknown as SmartlingAuthApi,
|
|
41
|
+
loggerMock
|
|
42
|
+
);
|
|
43
|
+
issuesServiceApiFetchStub = sinon.stub(issuesApi, "fetch");
|
|
44
|
+
issuesServiceApiUaStub = sinon.stub(issuesApi, "ua");
|
|
45
|
+
responseMockJsonStub = sinon.stub(responseMock, "json");
|
|
46
|
+
|
|
47
|
+
issuesServiceApiUaStub.returns("test_user_agent");
|
|
48
|
+
issuesServiceApiFetchStub.returns(responseMock);
|
|
49
|
+
responseMockJsonStub.returns({
|
|
50
|
+
response: {}
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
afterEach(() => {
|
|
55
|
+
issuesServiceApiFetchStub.restore();
|
|
56
|
+
responseMockJsonStub.restore();
|
|
57
|
+
issuesServiceApiUaStub.restore();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
describe("Methods", () => {
|
|
61
|
+
it("Create issue", async () => {
|
|
62
|
+
const params = new CreateIssueParameters()
|
|
63
|
+
.setIssueText("This translation is incorrect.")
|
|
64
|
+
.setIssueType(IssueType.TRANSLATION)
|
|
65
|
+
.setIssueSubType(IssueSubType.POOR_TRANSLATION)
|
|
66
|
+
.setString({ hashcode: "c32c16cddafd63dfa0dc12449372a093", localeId: "ru-RU" })
|
|
67
|
+
.setIssueSeverityLevel(IssueSeverityLevel.LOW);
|
|
68
|
+
|
|
69
|
+
await issuesApi.createIssue(projectId, params);
|
|
70
|
+
|
|
71
|
+
sinon.assert.calledOnce(issuesServiceApiFetchStub);
|
|
72
|
+
sinon.assert.calledWithExactly(
|
|
73
|
+
issuesServiceApiFetchStub,
|
|
74
|
+
`https://test.com/issues-api/v2/projects/${projectId}/issues`,
|
|
75
|
+
{
|
|
76
|
+
body: "{\"issueText\":\"This translation is incorrect.\",\"issueTypeCode\":\"TRANSLATION\",\"issueSubTypeCode\":\"POOR_TRANSLATION\",\"string\":{\"hashcode\":\"c32c16cddafd63dfa0dc12449372a093\",\"localeId\":\"ru-RU\"},\"issueSeverityLevelCode\":\"LOW\"}",
|
|
77
|
+
headers: {
|
|
78
|
+
Authorization: "test_token_type test_access_token",
|
|
79
|
+
"Content-Type": "application/json",
|
|
80
|
+
"User-Agent": "test_user_agent"
|
|
81
|
+
},
|
|
82
|
+
method: "post"
|
|
83
|
+
}
|
|
84
|
+
);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it("Edit issue", async () => {
|
|
88
|
+
const params = new EditIssueParameters().setIssueText("Edited issue text.");
|
|
89
|
+
|
|
90
|
+
await issuesApi.editIssue(projectId, issueUid, params);
|
|
91
|
+
|
|
92
|
+
sinon.assert.calledOnce(issuesServiceApiFetchStub);
|
|
93
|
+
sinon.assert.calledWithExactly(
|
|
94
|
+
issuesServiceApiFetchStub,
|
|
95
|
+
`https://test.com/issues-api/v2/projects/${projectId}/issues/${issueUid}/issueText`,
|
|
96
|
+
{
|
|
97
|
+
body: "{\"issueText\":\"Edited issue text.\"}",
|
|
98
|
+
headers: {
|
|
99
|
+
Authorization: "test_token_type test_access_token",
|
|
100
|
+
"Content-Type": "application/json",
|
|
101
|
+
"User-Agent": "test_user_agent"
|
|
102
|
+
},
|
|
103
|
+
method: "put"
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("Open or close issue", async () => {
|
|
109
|
+
const params = new UpdateIssueStateParameters().setIssueState(IssueState.RESOLVED);
|
|
110
|
+
|
|
111
|
+
await issuesApi.openOrCloseIssue(projectId, issueUid, params);
|
|
112
|
+
|
|
113
|
+
sinon.assert.calledOnce(issuesServiceApiFetchStub);
|
|
114
|
+
sinon.assert.calledWithExactly(
|
|
115
|
+
issuesServiceApiFetchStub,
|
|
116
|
+
`https://test.com/issues-api/v2/projects/${projectId}/issues/${issueUid}/state`,
|
|
117
|
+
{
|
|
118
|
+
body: "{\"issueStateCode\":\"RESOLVED\"}",
|
|
119
|
+
headers: {
|
|
120
|
+
Authorization: "test_token_type test_access_token",
|
|
121
|
+
"Content-Type": "application/json",
|
|
122
|
+
"User-Agent": "test_user_agent"
|
|
123
|
+
},
|
|
124
|
+
method: "put"
|
|
125
|
+
}
|
|
126
|
+
);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it("Get issue details", async () => {
|
|
130
|
+
await issuesApi.getIssueDetails(projectId, issueUid);
|
|
131
|
+
|
|
132
|
+
sinon.assert.calledOnce(issuesServiceApiFetchStub);
|
|
133
|
+
sinon.assert.calledWithExactly(
|
|
134
|
+
issuesServiceApiFetchStub,
|
|
135
|
+
`https://test.com/issues-api/v2/projects/${projectId}/issues/${issueUid}`,
|
|
136
|
+
{
|
|
137
|
+
headers: {
|
|
138
|
+
Authorization: "test_token_type test_access_token",
|
|
139
|
+
"Content-Type": "application/json",
|
|
140
|
+
"User-Agent": "test_user_agent"
|
|
141
|
+
},
|
|
142
|
+
method: "get"
|
|
143
|
+
}
|
|
144
|
+
);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it("Update issue answered", async () => {
|
|
148
|
+
const params = new UpdateIssueAnsweredParameters().setAnswered(true);
|
|
149
|
+
|
|
150
|
+
await issuesApi.updateIssueAnswered(projectId, issueUid, params);
|
|
151
|
+
|
|
152
|
+
sinon.assert.calledOnce(issuesServiceApiFetchStub);
|
|
153
|
+
sinon.assert.calledWithExactly(
|
|
154
|
+
issuesServiceApiFetchStub,
|
|
155
|
+
`https://test.com/issues-api/v2/projects/${projectId}/issues/${issueUid}/answered`,
|
|
156
|
+
{
|
|
157
|
+
body: "{\"answered\":true}",
|
|
158
|
+
headers: {
|
|
159
|
+
Authorization: "test_token_type test_access_token",
|
|
160
|
+
"Content-Type": "application/json",
|
|
161
|
+
"User-Agent": "test_user_agent"
|
|
162
|
+
},
|
|
163
|
+
method: "put"
|
|
164
|
+
}
|
|
165
|
+
);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it("Update issue assignee", async () => {
|
|
169
|
+
const params = new UpdateIssueAssigneeParameters().setAssigneeUserUid("661801f19693");
|
|
170
|
+
|
|
171
|
+
await issuesApi.updateIssueAssignee(projectId, issueUid, params);
|
|
172
|
+
|
|
173
|
+
sinon.assert.calledOnce(issuesServiceApiFetchStub);
|
|
174
|
+
sinon.assert.calledWithExactly(
|
|
175
|
+
issuesServiceApiFetchStub,
|
|
176
|
+
`https://test.com/issues-api/v2/projects/${projectId}/issues/${issueUid}/assignee`,
|
|
177
|
+
{
|
|
178
|
+
body: "{\"assigneeUserUid\":\"661801f19693\"}",
|
|
179
|
+
headers: {
|
|
180
|
+
Authorization: "test_token_type test_access_token",
|
|
181
|
+
"Content-Type": "application/json",
|
|
182
|
+
"User-Agent": "test_user_agent"
|
|
183
|
+
},
|
|
184
|
+
method: "put"
|
|
185
|
+
}
|
|
186
|
+
);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it("Delete issue assignee", async () => {
|
|
190
|
+
await issuesApi.deleteIssueAssignee(projectId, issueUid);
|
|
191
|
+
|
|
192
|
+
sinon.assert.calledOnce(issuesServiceApiFetchStub);
|
|
193
|
+
sinon.assert.calledWithExactly(
|
|
194
|
+
issuesServiceApiFetchStub,
|
|
195
|
+
`https://test.com/issues-api/v2/projects/${projectId}/issues/${issueUid}/assignee`,
|
|
196
|
+
{
|
|
197
|
+
headers: {
|
|
198
|
+
Authorization: "test_token_type test_access_token",
|
|
199
|
+
"Content-Type": "application/json",
|
|
200
|
+
"User-Agent": "test_user_agent"
|
|
201
|
+
},
|
|
202
|
+
method: "delete"
|
|
203
|
+
}
|
|
204
|
+
);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it("Update issue severity level", async () => {
|
|
208
|
+
const params = new UpdateIssueSeverityLevelParameters()
|
|
209
|
+
.setIssueSeverityLevel(IssueSeverityLevel.HIGH);
|
|
210
|
+
|
|
211
|
+
await issuesApi.updateIssueSeverityLevel(projectId, issueUid, params);
|
|
212
|
+
|
|
213
|
+
sinon.assert.calledOnce(issuesServiceApiFetchStub);
|
|
214
|
+
sinon.assert.calledWithExactly(
|
|
215
|
+
issuesServiceApiFetchStub,
|
|
216
|
+
`https://test.com/issues-api/v2/projects/${projectId}/issues/${issueUid}/severity-level`,
|
|
217
|
+
{
|
|
218
|
+
body: "{\"issueSeverityLevelCode\":\"HIGH\"}",
|
|
219
|
+
headers: {
|
|
220
|
+
Authorization: "test_token_type test_access_token",
|
|
221
|
+
"Content-Type": "application/json",
|
|
222
|
+
"User-Agent": "test_user_agent"
|
|
223
|
+
},
|
|
224
|
+
method: "put"
|
|
225
|
+
}
|
|
226
|
+
);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
it("Update issue type", async () => {
|
|
230
|
+
const params = new UpdateIssueTypeParameters()
|
|
231
|
+
.setIssueType(IssueType.TRANSLATION)
|
|
232
|
+
.setIssueSubType(IssueSubType.POOR_TRANSLATION)
|
|
233
|
+
.setLocaleId("ru-RU");
|
|
234
|
+
|
|
235
|
+
await issuesApi.updateIssueType(projectId, issueUid, params);
|
|
236
|
+
|
|
237
|
+
sinon.assert.calledOnce(issuesServiceApiFetchStub);
|
|
238
|
+
sinon.assert.calledWithExactly(
|
|
239
|
+
issuesServiceApiFetchStub,
|
|
240
|
+
`https://test.com/issues-api/v2/projects/${projectId}/issues/${issueUid}/change-type`,
|
|
241
|
+
{
|
|
242
|
+
body: "{\"issueTypeCode\":\"TRANSLATION\",\"issueSubTypeCode\":\"POOR_TRANSLATION\",\"localeId\":\"ru-RU\"}",
|
|
243
|
+
headers: {
|
|
244
|
+
Authorization: "test_token_type test_access_token",
|
|
245
|
+
"Content-Type": "application/json",
|
|
246
|
+
"User-Agent": "test_user_agent"
|
|
247
|
+
},
|
|
248
|
+
method: "put"
|
|
249
|
+
}
|
|
250
|
+
);
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
it("Get issue comments", async () => {
|
|
254
|
+
await issuesApi.getIssueComments(projectId, issueUid);
|
|
255
|
+
|
|
256
|
+
sinon.assert.calledOnce(issuesServiceApiFetchStub);
|
|
257
|
+
sinon.assert.calledWithExactly(
|
|
258
|
+
issuesServiceApiFetchStub,
|
|
259
|
+
`https://test.com/issues-api/v2/projects/${projectId}/issues/${issueUid}/comments`,
|
|
260
|
+
{
|
|
261
|
+
headers: {
|
|
262
|
+
Authorization: "test_token_type test_access_token",
|
|
263
|
+
"Content-Type": "application/json",
|
|
264
|
+
"User-Agent": "test_user_agent"
|
|
265
|
+
},
|
|
266
|
+
method: "get"
|
|
267
|
+
}
|
|
268
|
+
);
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
it("Add issue comment", async () => {
|
|
272
|
+
const params = new CreateIssueCommentParameters().setCommentText("Looks good.");
|
|
273
|
+
|
|
274
|
+
await issuesApi.addIssueComment(projectId, issueUid, params);
|
|
275
|
+
|
|
276
|
+
sinon.assert.calledOnce(issuesServiceApiFetchStub);
|
|
277
|
+
sinon.assert.calledWithExactly(
|
|
278
|
+
issuesServiceApiFetchStub,
|
|
279
|
+
`https://test.com/issues-api/v2/projects/${projectId}/issues/${issueUid}/comments`,
|
|
280
|
+
{
|
|
281
|
+
body: "{\"commentText\":\"Looks good.\"}",
|
|
282
|
+
headers: {
|
|
283
|
+
Authorization: "test_token_type test_access_token",
|
|
284
|
+
"Content-Type": "application/json",
|
|
285
|
+
"User-Agent": "test_user_agent"
|
|
286
|
+
},
|
|
287
|
+
method: "post"
|
|
288
|
+
}
|
|
289
|
+
);
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
it("Update issue comment", async () => {
|
|
293
|
+
const params = new EditIssueCommentParameters().setCommentText("Updated comment.");
|
|
294
|
+
|
|
295
|
+
await issuesApi.updateIssueComment(projectId, issueUid, issueCommentUid, params);
|
|
296
|
+
|
|
297
|
+
sinon.assert.calledOnce(issuesServiceApiFetchStub);
|
|
298
|
+
sinon.assert.calledWithExactly(
|
|
299
|
+
issuesServiceApiFetchStub,
|
|
300
|
+
`https://test.com/issues-api/v2/projects/${projectId}/issues/${issueUid}/comments/${issueCommentUid}`,
|
|
301
|
+
{
|
|
302
|
+
body: "{\"commentText\":\"Updated comment.\"}",
|
|
303
|
+
headers: {
|
|
304
|
+
Authorization: "test_token_type test_access_token",
|
|
305
|
+
"Content-Type": "application/json",
|
|
306
|
+
"User-Agent": "test_user_agent"
|
|
307
|
+
},
|
|
308
|
+
method: "put"
|
|
309
|
+
}
|
|
310
|
+
);
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
it("Get issue comment details", async () => {
|
|
314
|
+
await issuesApi.getIssueCommentDetails(projectId, issueUid, issueCommentUid);
|
|
315
|
+
|
|
316
|
+
sinon.assert.calledOnce(issuesServiceApiFetchStub);
|
|
317
|
+
sinon.assert.calledWithExactly(
|
|
318
|
+
issuesServiceApiFetchStub,
|
|
319
|
+
`https://test.com/issues-api/v2/projects/${projectId}/issues/${issueUid}/comments/${issueCommentUid}`,
|
|
320
|
+
{
|
|
321
|
+
headers: {
|
|
322
|
+
Authorization: "test_token_type test_access_token",
|
|
323
|
+
"Content-Type": "application/json",
|
|
324
|
+
"User-Agent": "test_user_agent"
|
|
325
|
+
},
|
|
326
|
+
method: "get"
|
|
327
|
+
}
|
|
328
|
+
);
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
it("Delete issue comment", async () => {
|
|
332
|
+
await issuesApi.deleteIssueComment(projectId, issueUid, issueCommentUid);
|
|
333
|
+
|
|
334
|
+
sinon.assert.calledOnce(issuesServiceApiFetchStub);
|
|
335
|
+
sinon.assert.calledWithExactly(
|
|
336
|
+
issuesServiceApiFetchStub,
|
|
337
|
+
`https://test.com/issues-api/v2/projects/${projectId}/issues/${issueUid}/comments/${issueCommentUid}`,
|
|
338
|
+
{
|
|
339
|
+
headers: {
|
|
340
|
+
Authorization: "test_token_type test_access_token",
|
|
341
|
+
"Content-Type": "application/json",
|
|
342
|
+
"User-Agent": "test_user_agent"
|
|
343
|
+
},
|
|
344
|
+
method: "delete"
|
|
345
|
+
}
|
|
346
|
+
);
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
it("Find project issues", async () => {
|
|
350
|
+
const params = new FindProjectIssuesParameters()
|
|
351
|
+
.setIssueTypeCodes([IssueType.TRANSLATION])
|
|
352
|
+
.setIssueStateCodes([IssueState.OPENED])
|
|
353
|
+
.setLimit(50)
|
|
354
|
+
.setOffset(0)
|
|
355
|
+
.setSortBy({
|
|
356
|
+
items: [{ direction: Order.DESC, fieldName: IssueSortField.CREATED_DATE }]
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
await issuesApi.findProjectIssues(projectId, params);
|
|
360
|
+
|
|
361
|
+
sinon.assert.calledOnce(issuesServiceApiFetchStub);
|
|
362
|
+
sinon.assert.calledWithExactly(
|
|
363
|
+
issuesServiceApiFetchStub,
|
|
364
|
+
`https://test.com/issues-api/v2/projects/${projectId}/issues/list`,
|
|
365
|
+
{
|
|
366
|
+
body: "{\"issueTypeCodes\":[\"TRANSLATION\"],\"issueStateCodes\":[\"OPENED\"],\"limit\":50,\"offset\":0,\"sortBy\":{\"items\":[{\"direction\":\"DESC\",\"fieldName\":\"createdDate\"}]}}",
|
|
367
|
+
headers: {
|
|
368
|
+
Authorization: "test_token_type test_access_token",
|
|
369
|
+
"Content-Type": "application/json",
|
|
370
|
+
"User-Agent": "test_user_agent"
|
|
371
|
+
},
|
|
372
|
+
method: "post"
|
|
373
|
+
}
|
|
374
|
+
);
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
it("Count project issues", async () => {
|
|
378
|
+
const params = new CountProjectIssuesParameters()
|
|
379
|
+
.setIssueStateCodes([IssueState.OPENED, IssueState.RESOLVED]);
|
|
380
|
+
|
|
381
|
+
await issuesApi.countProjectIssues(projectId, params);
|
|
382
|
+
|
|
383
|
+
sinon.assert.calledOnce(issuesServiceApiFetchStub);
|
|
384
|
+
sinon.assert.calledWithExactly(
|
|
385
|
+
issuesServiceApiFetchStub,
|
|
386
|
+
`https://test.com/issues-api/v2/projects/${projectId}/issues/count`,
|
|
387
|
+
{
|
|
388
|
+
body: "{\"issueStateCodes\":[\"OPENED\",\"RESOLVED\"]}",
|
|
389
|
+
headers: {
|
|
390
|
+
Authorization: "test_token_type test_access_token",
|
|
391
|
+
"Content-Type": "application/json",
|
|
392
|
+
"User-Agent": "test_user_agent"
|
|
393
|
+
},
|
|
394
|
+
method: "post"
|
|
395
|
+
}
|
|
396
|
+
);
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
it("Find account issues", async () => {
|
|
400
|
+
const params = new FindAccountIssuesParameters()
|
|
401
|
+
.setProjectIds(["project1", "project2"])
|
|
402
|
+
.setIssueTypeCodes([IssueType.SOURCE])
|
|
403
|
+
.setLimit(30)
|
|
404
|
+
.setOffset(0);
|
|
405
|
+
|
|
406
|
+
await issuesApi.findAccountIssues(accountUid, params);
|
|
407
|
+
|
|
408
|
+
sinon.assert.calledOnce(issuesServiceApiFetchStub);
|
|
409
|
+
sinon.assert.calledWithExactly(
|
|
410
|
+
issuesServiceApiFetchStub,
|
|
411
|
+
`https://test.com/issues-api/v2/accounts/${accountUid}/issues/list`,
|
|
412
|
+
{
|
|
413
|
+
body: "{\"projectIds\":[\"project1\",\"project2\"],\"issueTypeCodes\":[\"SOURCE\"],\"limit\":30,\"offset\":0}",
|
|
414
|
+
headers: {
|
|
415
|
+
Authorization: "test_token_type test_access_token",
|
|
416
|
+
"Content-Type": "application/json",
|
|
417
|
+
"User-Agent": "test_user_agent"
|
|
418
|
+
},
|
|
419
|
+
method: "post"
|
|
420
|
+
}
|
|
421
|
+
);
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
it("Count account issues", async () => {
|
|
425
|
+
const params = new CountAccountIssuesParameters()
|
|
426
|
+
.setProjectIds(["project1"])
|
|
427
|
+
.setAnswered(false);
|
|
428
|
+
|
|
429
|
+
await issuesApi.countAccountIssues(accountUid, params);
|
|
430
|
+
|
|
431
|
+
sinon.assert.calledOnce(issuesServiceApiFetchStub);
|
|
432
|
+
sinon.assert.calledWithExactly(
|
|
433
|
+
issuesServiceApiFetchStub,
|
|
434
|
+
`https://test.com/issues-api/v2/accounts/${accountUid}/issues/count`,
|
|
435
|
+
{
|
|
436
|
+
body: "{\"projectIds\":[\"project1\"],\"answered\":false}",
|
|
437
|
+
headers: {
|
|
438
|
+
Authorization: "test_token_type test_access_token",
|
|
439
|
+
"Content-Type": "application/json",
|
|
440
|
+
"User-Agent": "test_user_agent"
|
|
441
|
+
},
|
|
442
|
+
method: "post"
|
|
443
|
+
}
|
|
444
|
+
);
|
|
445
|
+
});
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
describe("Parameter validation", () => {
|
|
449
|
+
it("BaseIssuesFilterParameters should validate issueNumbers limit", () => {
|
|
450
|
+
const params = new CountProjectIssuesParameters();
|
|
451
|
+
const tooManyNumbers = Array(1001).fill(1);
|
|
452
|
+
|
|
453
|
+
try {
|
|
454
|
+
params.setIssueNumbers(tooManyNumbers);
|
|
455
|
+
throw new Error("Exception is not thrown.");
|
|
456
|
+
} catch (e) {
|
|
457
|
+
assert.equal(e.constructor.name, "SmartlingException");
|
|
458
|
+
assert.equal(e.message, "Issue numbers array must not exceed 1000 items");
|
|
459
|
+
}
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
it("BaseIssuesFilterParameters should validate jobFilter jobUids limit", () => {
|
|
463
|
+
const params = new CountProjectIssuesParameters();
|
|
464
|
+
const tooManyUids = Array(1001).fill("uid");
|
|
465
|
+
|
|
466
|
+
try {
|
|
467
|
+
params.setJobFilter({ jobUids: tooManyUids, presence: JobFilterPresence.HAS_ANY });
|
|
468
|
+
throw new Error("Exception is not thrown.");
|
|
469
|
+
} catch (e) {
|
|
470
|
+
assert.equal(e.constructor.name, "SmartlingException");
|
|
471
|
+
assert.equal(e.message, "Job filter jobUids array must not exceed 1000 items");
|
|
472
|
+
}
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
it("CreateIssueParameters should validate issueText length", () => {
|
|
476
|
+
const params = new CreateIssueParameters();
|
|
477
|
+
const tooLong = "a".repeat(4001);
|
|
478
|
+
|
|
479
|
+
try {
|
|
480
|
+
params.setIssueText(tooLong);
|
|
481
|
+
throw new Error("Exception is not thrown.");
|
|
482
|
+
} catch (e) {
|
|
483
|
+
assert.equal(e.constructor.name, "SmartlingException");
|
|
484
|
+
assert.equal(e.message, "Issue text length must not exceed 4000 characters");
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
|
|
488
|
+
it("EditIssueParameters should validate issueText length", () => {
|
|
489
|
+
const params = new EditIssueParameters();
|
|
490
|
+
const tooLong = "a".repeat(4001);
|
|
491
|
+
|
|
492
|
+
try {
|
|
493
|
+
params.setIssueText(tooLong);
|
|
494
|
+
throw new Error("Exception is not thrown.");
|
|
495
|
+
} catch (e) {
|
|
496
|
+
assert.equal(e.constructor.name, "SmartlingException");
|
|
497
|
+
assert.equal(e.message, "Issue text length must not exceed 4000 characters");
|
|
498
|
+
}
|
|
499
|
+
});
|
|
500
|
+
|
|
501
|
+
it("UpdateIssueAssigneeParameters should reject empty assigneeUserUid", () => {
|
|
502
|
+
const params = new UpdateIssueAssigneeParameters();
|
|
503
|
+
|
|
504
|
+
try {
|
|
505
|
+
params.setAssigneeUserUid("");
|
|
506
|
+
throw new Error("Exception is not thrown.");
|
|
507
|
+
} catch (e) {
|
|
508
|
+
assert.equal(e.constructor.name, "SmartlingException");
|
|
509
|
+
assert.equal(e.message, "assigneeUserUid is required");
|
|
510
|
+
}
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
it("CreateIssueCommentParameters should validate commentText length", () => {
|
|
514
|
+
const params = new CreateIssueCommentParameters();
|
|
515
|
+
const tooLong = "a".repeat(4001);
|
|
516
|
+
|
|
517
|
+
try {
|
|
518
|
+
params.setCommentText(tooLong);
|
|
519
|
+
throw new Error("Exception is not thrown.");
|
|
520
|
+
} catch (e) {
|
|
521
|
+
assert.equal(e.constructor.name, "SmartlingException");
|
|
522
|
+
assert.equal(e.message, "Comment text length must not exceed 4000 characters");
|
|
523
|
+
}
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
it("EditIssueCommentParameters should validate commentText length", () => {
|
|
527
|
+
const params = new EditIssueCommentParameters();
|
|
528
|
+
const tooLong = "a".repeat(4001);
|
|
529
|
+
|
|
530
|
+
try {
|
|
531
|
+
params.setCommentText(tooLong);
|
|
532
|
+
throw new Error("Exception is not thrown.");
|
|
533
|
+
} catch (e) {
|
|
534
|
+
assert.equal(e.constructor.name, "SmartlingException");
|
|
535
|
+
assert.equal(e.message, "Comment text length must not exceed 4000 characters");
|
|
536
|
+
}
|
|
537
|
+
});
|
|
538
|
+
|
|
539
|
+
it("FindProjectIssuesParameters should validate limit is non-negative", () => {
|
|
540
|
+
const params = new FindProjectIssuesParameters();
|
|
541
|
+
|
|
542
|
+
try {
|
|
543
|
+
params.setLimit(-1);
|
|
544
|
+
throw new Error("Exception is not thrown.");
|
|
545
|
+
} catch (e) {
|
|
546
|
+
assert.equal(e.constructor.name, "SmartlingException");
|
|
547
|
+
assert.equal(e.message, "Limit must be non-negative");
|
|
548
|
+
}
|
|
549
|
+
});
|
|
550
|
+
|
|
551
|
+
it("FindProjectIssuesParameters should validate offset is non-negative", () => {
|
|
552
|
+
const params = new FindProjectIssuesParameters();
|
|
553
|
+
|
|
554
|
+
try {
|
|
555
|
+
params.setOffset(-1);
|
|
556
|
+
throw new Error("Exception is not thrown.");
|
|
557
|
+
} catch (e) {
|
|
558
|
+
assert.equal(e.constructor.name, "SmartlingException");
|
|
559
|
+
assert.equal(e.message, "Offset must be non-negative");
|
|
560
|
+
}
|
|
561
|
+
});
|
|
562
|
+
|
|
563
|
+
it("FindAccountIssuesParameters should validate limit is non-negative", () => {
|
|
564
|
+
const params = new FindAccountIssuesParameters();
|
|
565
|
+
|
|
566
|
+
try {
|
|
567
|
+
params.setLimit(-1);
|
|
568
|
+
throw new Error("Exception is not thrown.");
|
|
569
|
+
} catch (e) {
|
|
570
|
+
assert.equal(e.constructor.name, "SmartlingException");
|
|
571
|
+
assert.equal(e.message, "Limit must be non-negative");
|
|
572
|
+
}
|
|
573
|
+
});
|
|
574
|
+
|
|
575
|
+
it("FindAccountIssuesParameters should validate offset is non-negative", () => {
|
|
576
|
+
const params = new FindAccountIssuesParameters();
|
|
577
|
+
|
|
578
|
+
try {
|
|
579
|
+
params.setOffset(-1);
|
|
580
|
+
throw new Error("Exception is not thrown.");
|
|
581
|
+
} catch (e) {
|
|
582
|
+
assert.equal(e.constructor.name, "SmartlingException");
|
|
583
|
+
assert.equal(e.message, "Offset must be non-negative");
|
|
584
|
+
}
|
|
585
|
+
});
|
|
586
|
+
});
|
|
587
|
+
|
|
588
|
+
describe("Edge cases", () => {
|
|
589
|
+
it("Should accept maximum issueText length", () => {
|
|
590
|
+
const params = new CreateIssueParameters();
|
|
591
|
+
const maxText = "a".repeat(4000);
|
|
592
|
+
params.setIssueText(maxText);
|
|
593
|
+
assert.equal(params.export().issueText, maxText);
|
|
594
|
+
});
|
|
595
|
+
|
|
596
|
+
it("Should accept maximum commentText length", () => {
|
|
597
|
+
const params = new CreateIssueCommentParameters();
|
|
598
|
+
const maxText = "a".repeat(4000);
|
|
599
|
+
params.setCommentText(maxText);
|
|
600
|
+
assert.equal(params.export().commentText, maxText);
|
|
601
|
+
});
|
|
602
|
+
|
|
603
|
+
it("Should accept maximum issue numbers", () => {
|
|
604
|
+
const params = new CountProjectIssuesParameters();
|
|
605
|
+
const maxNumbers = Array(1000).fill(1);
|
|
606
|
+
params.setIssueNumbers(maxNumbers);
|
|
607
|
+
assert.deepStrictEqual(params.export().issueNumbers, maxNumbers);
|
|
608
|
+
});
|
|
609
|
+
|
|
610
|
+
it("Should accept maximum jobUids in jobFilter", () => {
|
|
611
|
+
const params = new CountProjectIssuesParameters();
|
|
612
|
+
const maxUids = Array(1000).fill("uid");
|
|
613
|
+
params.setJobFilter({ jobUids: maxUids, presence: JobFilterPresence.HAS_ANY });
|
|
614
|
+
assert.deepStrictEqual(params.export().jobFilter.jobUids, maxUids);
|
|
615
|
+
});
|
|
616
|
+
|
|
617
|
+
it("Should accept zero limit and offset", () => {
|
|
618
|
+
const params = new FindProjectIssuesParameters();
|
|
619
|
+
params.setLimit(0).setOffset(0);
|
|
620
|
+
assert.equal(params.export().limit, 0);
|
|
621
|
+
assert.equal(params.export().offset, 0);
|
|
622
|
+
});
|
|
623
|
+
});
|
|
624
|
+
});
|