Skip to content

Commit c730962

Browse files
authored
feat: users (#116)
1 parent 71e531f commit c730962

File tree

11 files changed

+484
-84
lines changed

11 files changed

+484
-84
lines changed

src/common/data/table-data/table-data-form-data-builder/table-data-form-data-builder.ts

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -77,20 +77,6 @@ export class TableDataFormDataBuilder {
7777
return this;
7878
}
7979

80-
withApplications(applications: Array<string> | undefined): TableDataFormDataBuilder {
81-
if (applications && applications.length) {
82-
this._formParts.appNames = applications.join(',');
83-
}
84-
return this;
85-
}
86-
87-
withVersions(versions: Array<string> | undefined): TableDataFormDataBuilder {
88-
if (versions && versions.length) {
89-
this._formParts.versions = versions.join(',');
90-
}
91-
return this;
92-
}
93-
9480
entries(): Record<string, string> {
9581
return this._formParts;
9682
}

src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ export * from './events';
55
export * from './post';
66
export * from './summary';
77
export * from './versions';
8-
export * from './symbols';
8+
export * from './symbols';
9+
export * from './users';

src/summary/summary-api-client/summary-api-client.spec.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { createFakeBugSplatApiClient } from '@spec/fakes/common/bugsplat-api-client';
22
import { createFakeFormData } from '@spec/fakes/common/form-data';
33
import { createFakeResponseBody } from '@spec/fakes/common/response';
4-
import * as SummaryTableDataClientModule from '../summary-table-data/summary-table-data-client';
4+
import * as TableDataClientModule from '../../common/data/table-data/table-data-client/table-data-client';
55
import { SummaryApiClient } from './summary-api-client';
66

77
describe('SummaryApiClient', () => {
@@ -31,24 +31,30 @@ describe('SummaryApiClient', () => {
3131
pageData = { coffee: 'black rifle' };
3232
rows = [{ stackKeyId, subKeyDepth, userSum }];
3333
tableDataClientResponse = createFakeResponseBody(200, { pageData, rows });
34-
tableDataClient = jasmine.createSpyObj('SummaryTableDataClient', ['postGetData']);
34+
tableDataClient = jasmine.createSpyObj('TableDataClient', ['postGetData']);
3535
tableDataClient.postGetData.and.resolveTo(tableDataClientResponse);
36-
spyOn(SummaryTableDataClientModule, 'SummaryTableDataClient').and.returnValue(tableDataClient);
36+
spyOn(TableDataClientModule, 'TableDataClient').and.returnValue(tableDataClient);
3737

3838
sut = new SummaryApiClient(apiClient);
3939
});
4040

4141
describe('getSummary', () => {
42+
let applications;
43+
let versions;
4244
let result;
4345
let request;
4446

4547
beforeEach(async () => {
46-
request = { database };
48+
applications = ['☕️', '🍵'];
49+
versions = ['1.0.0', '2.0.0'];
50+
request = { database, applications, versions };
4751
result = await sut.getSummary(request);
4852
});
4953

50-
it('should call postGetData with request', () => {
51-
expect(tableDataClient.postGetData).toHaveBeenCalledWith(request);
54+
it('should call postGetData with request and initial formParts', () => {
55+
const expectedAppNames = applications.join(',');
56+
const expectedVersions = versions.join(',');
57+
expect(tableDataClient.postGetData).toHaveBeenCalledWith(request, { appNames: expectedAppNames, versions: expectedVersions });
5258
});
5359

5460
it('should return value with stackKeyId, subKeyDepth, and userSum values mapped to numbers', () => {

src/summary/summary-api-client/summary-api-client.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,27 @@
1-
import { ApiClient, TableDataResponse } from '@common';
1+
import { ApiClient, TableDataClient, TableDataResponse } from '@common';
22
import { SummaryApiResponseRow, SummaryApiRow } from '../summary-api-row/summary-api-row';
3-
import { SummaryTableDataClient } from '../summary-table-data/summary-table-data-client';
43
import { SummaryTableDataRequest } from '../summary-table-data/summary-table-data-request';
54

65
export class SummaryApiClient {
76

8-
private _tableDataClient: SummaryTableDataClient;
7+
private _tableDataClient: TableDataClient;
98

109
constructor(private _client: ApiClient) {
11-
this._tableDataClient = new SummaryTableDataClient(this._client, '/summary?data');
10+
this._tableDataClient = new TableDataClient(this._client, '/summary?data');
1211
}
1312

1413
async getSummary(request: SummaryTableDataRequest): Promise<TableDataResponse<SummaryApiRow>> {
15-
const response = await this._tableDataClient.postGetData(request);
14+
const formParts = {};
15+
if (request.applications && request.applications.length) {
16+
formParts['appNames'] = request.applications.join(',');
17+
}
18+
if (request.versions && request.versions.length) {
19+
formParts['versions'] = request.versions.join(',');
20+
}
21+
const response = await this._tableDataClient.postGetData<SummaryApiResponseRow>(request, formParts);
1622
const json = await response.json();
1723
const pageData = json.pageData;
18-
const rows = json.rows.map((row: SummaryApiResponseRow) => new SummaryApiRow(
24+
const rows = json.rows.map(row => new SummaryApiRow(
1925
row.stackKey,
2026
Number(row.stackKeyId),
2127
row.firstReport,
@@ -28,7 +34,7 @@ export class SummaryApiClient {
2834
row.comments,
2935
Number(row.subKeyDepth),
3036
Number(row.userSum)
31-
)
37+
)
3238
);
3339

3440
return {

src/summary/summary-table-data/summary-table-data-client.ts

Lines changed: 0 additions & 56 deletions
This file was deleted.

src/users/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export { UsersApiClient, UsersApiResponse, AddUserResponse } from './users-api-client/users-api-client';
2+
export { UsersTableDataRequest } from './users-api-client/users-table-data-request';
3+
export { UsersApiRow } from './users-api-client/users-api-row';
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
import { BugSplatApiClient } from '@common';
2+
import { config } from '@spec/config';
3+
import { UserApiResponseStatus, UsersApiClient } from './users-api-client';
4+
5+
describe('UsersApiClient', () => {
6+
let companyId: number;
7+
let testEmail: string;
8+
let usersClient: UsersApiClient;
9+
10+
beforeEach(async () => {
11+
const { host, email, password } = config;
12+
const bugsplat = await BugSplatApiClient.createAuthenticatedClientForNode(email, password, host);
13+
companyId = await getCompanyId(bugsplat, config.database);
14+
usersClient = new UsersApiClient(bugsplat);
15+
testEmail = 'bobby+unittests@bugsplat.com';
16+
});
17+
18+
describe('getUsers', () => {
19+
it('should return 200 and a specific user', async () => {
20+
const database = config.database;
21+
22+
const { rows } = await usersClient.getUsers({
23+
database,
24+
email: config.email
25+
});
26+
27+
const userRow = rows[0];
28+
expect(rows).toBeTruthy();
29+
expect(userRow).toBeTruthy();
30+
});
31+
32+
it('should return 200 and array of users', async () => {
33+
const database = config.database;
34+
35+
const { rows } = await usersClient.getUsers({
36+
database,
37+
});
38+
39+
const userRow = rows.find(row => row.username === config.email);
40+
expect(rows).toBeTruthy();
41+
expect(userRow).toBeTruthy();
42+
});
43+
});
44+
45+
describe('addUserToDatabase', () => {
46+
it('should return 200 and message', async () => {
47+
const response = await usersClient.addUserToDatabase(config.database, testEmail);
48+
const body = await response.json();
49+
expect(response.status).toEqual(200);
50+
expect(body.status).toEqual(UserApiResponseStatus.success);
51+
});
52+
});
53+
54+
describe('removeUserFromDatabase', () => {
55+
it('should return 200 and message', async () => {
56+
const { uId } = await await usersClient.addUserToDatabase(config.database, testEmail).then(response => response.json());
57+
const response = await usersClient.removeUserFromDatabase(config.database, uId);
58+
const body = await response.json();
59+
expect(response.status).toEqual(200);
60+
expect(body.status).toEqual(UserApiResponseStatus.success);
61+
});
62+
});
63+
64+
describe('updateUserForDatabase', () => {
65+
it('should return 200 and message', async () => {
66+
const { uId: uIdAdded } = await await usersClient.addUserToDatabase(config.database, testEmail).then(response => response.json());
67+
const response = await usersClient.updateUserForDatabase(config.database, testEmail, false);
68+
const body = await response.json();
69+
expect(response.status).toEqual(200);
70+
expect(body.status).toEqual(UserApiResponseStatus.success);
71+
expect(uIdAdded).toEqual(body.uId);
72+
});
73+
});
74+
75+
describe('addUserToCompany', () => {
76+
it('should return 200 and message', async () => {
77+
const response = await usersClient.addUserToCompany(companyId, testEmail);
78+
const body = await response.json();
79+
expect(response.status).toEqual(200);
80+
expect(body.status).not.toEqual(UserApiResponseStatus.fail);
81+
});
82+
});
83+
84+
describe('removeUserFromCompany', () => {
85+
it('should return 200 and message', async () => {
86+
const { uId: uIdAdded } = await await usersClient.addUserToCompany(companyId, testEmail).then(response => response.json());
87+
const response = await usersClient.removeUserFromCompany(companyId, uIdAdded);
88+
const body = await response.json();
89+
expect(response.status).toEqual(200);
90+
expect(body.status).not.toEqual(UserApiResponseStatus.fail);
91+
});
92+
});
93+
});
94+
95+
async function getCompanyId(apiClient: BugSplatApiClient, database: string): Promise<number> {
96+
const rows = await apiClient.fetch<Array<{ dbName: string, companyId: string }>>('/api/databases.php').then(response => response.json());
97+
const row = rows.find(row => row.dbName === database);
98+
if (!row?.companyId) {
99+
throw new Error(`Could not find database ${database}`);
100+
}
101+
return Number(row.companyId);
102+
}

0 commit comments

Comments
 (0)