Skip to content

Commit e2520fc

Browse files
authored
Merge pull request #834 from mgwojciech/dev
Jest unit tests
2 parents a95125e + 50154c7 commit e2520fc

File tree

7 files changed

+18936
-9794
lines changed

7 files changed

+18936
-9794
lines changed

package-lock.json

Lines changed: 18679 additions & 9788 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@
4747
"@microsoft/sp-module-interfaces": "1.11.0",
4848
"@microsoft/sp-tslint-rules": "1.11.0",
4949
"@microsoft/sp-webpart-workbench": "1.11.0",
50-
"@types/chai": "3.4.34",
50+
"@types/chai": "^3.4.34",
5151
"@types/chart.js": "2.7.40",
5252
"@types/enzyme": "2.8.7",
5353
"@types/es6-promise": "0.0.33",
54+
"@types/jest": "^25.2.3",
5455
"@types/lodash": "4.14.149",
55-
"@types/mocha": "2.2.38",
5656
"@types/react": "16.8.8",
5757
"@types/react-addons-shallow-compare": "0.14.17",
5858
"@types/react-addons-test-utils": "0.14.15",
@@ -62,15 +62,21 @@
6262
"@types/webpack-env": "1.13.1",
6363
"ajv": "~5.2.2",
6464
"amd-loader": "0.0.8",
65+
"chai": "^4.3.4",
6566
"codecov": "3.6.5",
66-
"enzyme": "2.9.1",
67+
"enzyme": "^2.9.1",
68+
"enzyme-adapter-react-16": "^1.15.6",
6769
"gulp": "~3.9.1",
6870
"husky": "4.2.5",
71+
"identity-obj-proxy": "^3.0.0",
72+
"jest": "^25.5.4",
73+
"jest-cli": "^25.5.4",
6974
"karma-html-reporter": "0.2.7",
7075
"karma-remap-coverage": "^0.1.4",
7176
"react-addons-test-utils": "15.6.0",
7277
"request-promise": "4.2.5",
7378
"sonarqube-scanner": "2.1.2",
79+
"ts-jest": "^25.5.1",
7480
"tslib": "2.0.0",
7581
"webpack-bundle-analyzer": "^4.1.0"
7682
},
@@ -102,5 +108,27 @@
102108
"hooks": {
103109
"pre-commit": "npm run changelog"
104110
}
111+
},
112+
"jest": {
113+
"transform": {
114+
"^.+\\.(ts|tsx)$": "ts-jest"
115+
},
116+
"setupFilesAfterEnv": [
117+
"./tests/setup.js"
118+
],
119+
"testRegex": "tests/.*\\.test.(ts?|tsx?)$",
120+
"moduleFileExtensions": [
121+
"ts",
122+
"tsx",
123+
"js",
124+
"json"
125+
],
126+
"moduleNameMapper": {
127+
"@ms/sp-telemetry": "identity-obj-proxy",
128+
"@microsoft/sp-webpart-base": "identity-obj-proxy",
129+
"@microsoft/sp-application-base": "identity-obj-proxy",
130+
"^resx-strings/en-us.json": "<rootDir>/node_modules/@microsoft/sp-core-library/lib/resx-strings/en-us.json",
131+
"\\.(css|scss)$": "identity-obj-proxy"
132+
}
105133
}
106134
}

src/controls/placeholder/PlaceholderComponent.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ describe('<Placeholder />', () => {
1818
const dummyLabel = "Dummy label";
1919
const dummyOnConfigure = sinon.spy((evt) => { /* Nothing to do here */ });
2020

21-
before(() => {
21+
beforeAll(() => {
2222
// Suppress icon warnings.
2323
setIconOptions({
2424
disableWarnings: true

src/webparts/controlsTest/test/ControlsTestWebPart.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/// <reference types="mocha" />
1+
/// <reference types="jest" />
22

33
import { assert } from 'chai';
44

tests/services/SPService.test.ts

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
///<reference types="jest" />
2+
3+
import { assert } from "chai";
4+
import { ILibsOptions, LibsOrderBy } from "../../src/services/ISPService";
5+
import SPService from "../../src/services/SPService";
6+
7+
describe("SPService", () => {
8+
test("getField (positive)", async () => {
9+
let calledApi = "";
10+
let ctx = {
11+
pageContext: {
12+
web: {
13+
absoluteUrl: "https://test.sharepoint.com/sites/test-site"
14+
}
15+
},
16+
spHttpClient: {
17+
get: (apiUrl: string) => {
18+
calledApi = apiUrl;
19+
return Promise.resolve({
20+
ok: true,
21+
json: () => Promise.resolve({
22+
Id: "test-field-id"
23+
})
24+
});
25+
}
26+
}
27+
}
28+
let spService = new SPService(ctx as any);
29+
let field = await spService.getField("test-list-id", "test-internal-column-name");
30+
assert.equal(field.Id, "test-field-id");
31+
assert.equal(calledApi, "https://test.sharepoint.com/sites/test-site/_api/web/lists('test-list-id')/fields/getByInternalNameOrTitle('test-internal-column-name')");
32+
});
33+
test("getField (positive - calculated)", async () => {
34+
let calledApi = "";
35+
let ctx = {
36+
pageContext: {
37+
web: {
38+
absoluteUrl: "https://test.sharepoint.com/sites/test-site"
39+
}
40+
},
41+
spHttpClient: {
42+
get: (apiUrl: string) => {
43+
calledApi = apiUrl;
44+
return Promise.resolve({
45+
ok: true,
46+
json: () => Promise.resolve({
47+
Id: "test-field-id",
48+
SchemaXml: `<Field Type="Calculated" DisplayName="TestCalculated" ResultType="Text"><Formula>=CONCATENATE(Title," Test")</Formula><FieldRefs><FieldRef Name="Title" /></FieldRefs></Field>`,
49+
TypeAsString: "Calculated"
50+
})
51+
});
52+
}
53+
}
54+
}
55+
let spService = new SPService(ctx as any);
56+
let field = await spService.getField("test-list-id", "test-internal-column-name");
57+
assert.equal(field.Id, "test-field-id");
58+
assert.equal(field.ResultType, "Text");
59+
assert.equal(calledApi, "https://test.sharepoint.com/sites/test-site/_api/web/lists('test-list-id')/fields/getByInternalNameOrTitle('test-internal-column-name')");
60+
});
61+
test("getField (negative)", async () => {
62+
let ctx = {
63+
pageContext: {
64+
web: {
65+
absoluteUrl: "https://test.sharepoint.com/sites/test-site"
66+
}
67+
},
68+
spHttpClient: {
69+
get: (apiUrl: string) => {
70+
return Promise.resolve({
71+
ok: false,
72+
json: () => Promise.resolve({
73+
Id: "test-field-id"
74+
})
75+
});
76+
}
77+
}
78+
}
79+
let spService = new SPService(ctx as any);
80+
let field = await spService.getField("test-list-id", "test-internal-column-name");
81+
assert.isUndefined(field);
82+
});
83+
test("getField (negative [exception])", async () => {
84+
let ctx = {
85+
pageContext: {
86+
web: {
87+
absoluteUrl: "https://test.sharepoint.com/sites/test-site"
88+
}
89+
},
90+
spHttpClient: {
91+
get: (apiUrl: string) => {
92+
throw "Test exception"
93+
}
94+
}
95+
}
96+
let spService = new SPService(ctx as any);
97+
try {
98+
let field = await spService.getField("test-list-id", "test-internal-column-name");
99+
throw "No error thrown";
100+
}
101+
catch (err) {
102+
assert.equal(err, "Test exception");
103+
}
104+
});
105+
106+
test.each([
107+
[
108+
{
109+
110+
},
111+
"https://test.sharepoint.com/sites/test-site/_api/web/lists?$select=Title,id,BaseTemplate"
112+
],
113+
[
114+
{
115+
orderBy: LibsOrderBy.Id
116+
},
117+
"https://test.sharepoint.com/sites/test-site/_api/web/lists?$select=Title,id,BaseTemplate&$orderby=Id"
118+
],
119+
[
120+
{
121+
orderBy: LibsOrderBy.Title
122+
},
123+
"https://test.sharepoint.com/sites/test-site/_api/web/lists?$select=Title,id,BaseTemplate&$orderby=Title"
124+
],
125+
[
126+
{
127+
filter: "Title eq 'Test'"
128+
},
129+
"https://test.sharepoint.com/sites/test-site/_api/web/lists?$select=Title,id,BaseTemplate&$filter=Title%20eq%20'Test'"
130+
],
131+
[
132+
{
133+
orderBy: LibsOrderBy.Title,
134+
filter: "Title eq 'Test'"
135+
},
136+
"https://test.sharepoint.com/sites/test-site/_api/web/lists?$select=Title,id,BaseTemplate&$orderby=Title&$filter=Title%20eq%20'Test'"
137+
],
138+
[
139+
{
140+
filter: "Title eq 'Test'",
141+
baseTemplate: 101
142+
},
143+
"https://test.sharepoint.com/sites/test-site/_api/web/lists?$select=Title,id,BaseTemplate&$filter=Title%20eq%20'Test'"
144+
],
145+
[
146+
{
147+
baseTemplate: 101
148+
},
149+
"https://test.sharepoint.com/sites/test-site/_api/web/lists?$select=Title,id,BaseTemplate&$filter=BaseTemplate eq 101"
150+
],
151+
[
152+
{
153+
baseTemplate: 101,
154+
includeHidden: false
155+
},
156+
"https://test.sharepoint.com/sites/test-site/_api/web/lists?$select=Title,id,BaseTemplate&$filter=BaseTemplate eq 101 and Hidden eq false"
157+
],
158+
[
159+
{
160+
includeHidden: false
161+
},
162+
"https://test.sharepoint.com/sites/test-site/_api/web/lists?$select=Title,id,BaseTemplate&$filter=Hidden eq false"
163+
]
164+
])("getLibs %j", async (options: ILibsOptions, expectedApi: string) => {
165+
let calledApi;
166+
let ctx = {
167+
pageContext: {
168+
web: {
169+
absoluteUrl: "https://test.sharepoint.com/sites/test-site"
170+
}
171+
},
172+
spHttpClient: {
173+
get: (apiUrl: string) => {
174+
calledApi = apiUrl;
175+
return Promise.resolve({
176+
ok: true,
177+
json: () => Promise.resolve([])
178+
});
179+
}
180+
}
181+
}
182+
let spService = new SPService(ctx as any);
183+
await spService.getLibs(options);
184+
185+
assert.equal(calledApi, expectedApi);
186+
});
187+
test("getLibs (negative)", async () => {
188+
let ctx = {
189+
pageContext: {
190+
web: {
191+
absoluteUrl: "https://test.sharepoint.com/sites/test-site"
192+
}
193+
},
194+
spHttpClient: {
195+
get: (apiUrl: string) => {
196+
return Promise.resolve({
197+
ok: false,
198+
json: () => Promise.resolve([])
199+
});
200+
}
201+
}
202+
}
203+
let spService = new SPService(ctx as any);
204+
let libs = await spService.getLibs({});
205+
206+
assert.isNull(libs);
207+
});
208+
});

tests/setup.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
jest.mock("@microsoft/sp-http", () => {
2+
return {
3+
SPHttpClient: {
4+
configurations: {
5+
v1: 1
6+
}
7+
},
8+
HttpClient: {
9+
configurations: {
10+
v1: 1
11+
}
12+
}
13+
}
14+
});

tsconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
],
3737
"exclude": [
3838
"node_modules",
39-
"lib"
39+
"lib",
40+
"./tests/**"
4041
]
4142
}

0 commit comments

Comments
 (0)