Skip to content

Commit

Permalink
feat: users (#116)
Browse files Browse the repository at this point in the history
  • Loading branch information
bobbyg603 authored Jan 17, 2024
1 parent 71e531f commit c730962
Show file tree
Hide file tree
Showing 11 changed files with 484 additions and 84 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -77,20 +77,6 @@ export class TableDataFormDataBuilder {
return this;
}

withApplications(applications: Array<string> | undefined): TableDataFormDataBuilder {
if (applications && applications.length) {
this._formParts.appNames = applications.join(',');
}
return this;
}

withVersions(versions: Array<string> | undefined): TableDataFormDataBuilder {
if (versions && versions.length) {
this._formParts.versions = versions.join(',');
}
return this;
}

entries(): Record<string, string> {
return this._formParts;
}
Expand Down
3 changes: 2 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ export * from './events';
export * from './post';
export * from './summary';
export * from './versions';
export * from './symbols';
export * from './symbols';
export * from './users';
18 changes: 12 additions & 6 deletions src/summary/summary-api-client/summary-api-client.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { createFakeBugSplatApiClient } from '@spec/fakes/common/bugsplat-api-client';
import { createFakeFormData } from '@spec/fakes/common/form-data';
import { createFakeResponseBody } from '@spec/fakes/common/response';
import * as SummaryTableDataClientModule from '../summary-table-data/summary-table-data-client';
import * as TableDataClientModule from '../../common/data/table-data/table-data-client/table-data-client';
import { SummaryApiClient } from './summary-api-client';

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

sut = new SummaryApiClient(apiClient);
});

describe('getSummary', () => {
let applications;
let versions;
let result;
let request;

beforeEach(async () => {
request = { database };
applications = ['☕️', '🍵'];
versions = ['1.0.0', '2.0.0'];
request = { database, applications, versions };
result = await sut.getSummary(request);
});

it('should call postGetData with request', () => {
expect(tableDataClient.postGetData).toHaveBeenCalledWith(request);
it('should call postGetData with request and initial formParts', () => {
const expectedAppNames = applications.join(',');
const expectedVersions = versions.join(',');
expect(tableDataClient.postGetData).toHaveBeenCalledWith(request, { appNames: expectedAppNames, versions: expectedVersions });
});

it('should return value with stackKeyId, subKeyDepth, and userSum values mapped to numbers', () => {
Expand Down
20 changes: 13 additions & 7 deletions src/summary/summary-api-client/summary-api-client.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,27 @@
import { ApiClient, TableDataResponse } from '@common';
import { ApiClient, TableDataClient, TableDataResponse } from '@common';
import { SummaryApiResponseRow, SummaryApiRow } from '../summary-api-row/summary-api-row';
import { SummaryTableDataClient } from '../summary-table-data/summary-table-data-client';
import { SummaryTableDataRequest } from '../summary-table-data/summary-table-data-request';

export class SummaryApiClient {

private _tableDataClient: SummaryTableDataClient;
private _tableDataClient: TableDataClient;

constructor(private _client: ApiClient) {
this._tableDataClient = new SummaryTableDataClient(this._client, '/summary?data');
this._tableDataClient = new TableDataClient(this._client, '/summary?data');
}

async getSummary(request: SummaryTableDataRequest): Promise<TableDataResponse<SummaryApiRow>> {
const response = await this._tableDataClient.postGetData(request);
const formParts = {};
if (request.applications && request.applications.length) {
formParts['appNames'] = request.applications.join(',');
}
if (request.versions && request.versions.length) {
formParts['versions'] = request.versions.join(',');
}
const response = await this._tableDataClient.postGetData<SummaryApiResponseRow>(request, formParts);
const json = await response.json();
const pageData = json.pageData;
const rows = json.rows.map((row: SummaryApiResponseRow) => new SummaryApiRow(
const rows = json.rows.map(row => new SummaryApiRow(
row.stackKey,
Number(row.stackKeyId),
row.firstReport,
Expand All @@ -28,7 +34,7 @@ export class SummaryApiClient {
row.comments,
Number(row.subKeyDepth),
Number(row.userSum)
)
)
);

return {
Expand Down
56 changes: 0 additions & 56 deletions src/summary/summary-table-data/summary-table-data-client.ts

This file was deleted.

3 changes: 3 additions & 0 deletions src/users/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export { UsersApiClient, UsersApiResponse, AddUserResponse } from './users-api-client/users-api-client';
export { UsersTableDataRequest } from './users-api-client/users-table-data-request';
export { UsersApiRow } from './users-api-client/users-api-row';
102 changes: 102 additions & 0 deletions src/users/users-api-client/users-api-client.e2e.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import { BugSplatApiClient } from '@common';
import { config } from '@spec/config';
import { UserApiResponseStatus, UsersApiClient } from './users-api-client';

describe('UsersApiClient', () => {
let companyId: number;
let testEmail: string;
let usersClient: UsersApiClient;

beforeEach(async () => {
const { host, email, password } = config;
const bugsplat = await BugSplatApiClient.createAuthenticatedClientForNode(email, password, host);
companyId = await getCompanyId(bugsplat, config.database);
usersClient = new UsersApiClient(bugsplat);
testEmail = '[email protected]';
});

describe('getUsers', () => {
it('should return 200 and a specific user', async () => {
const database = config.database;

const { rows } = await usersClient.getUsers({
database,
email: config.email
});

const userRow = rows[0];
expect(rows).toBeTruthy();
expect(userRow).toBeTruthy();
});

it('should return 200 and array of users', async () => {
const database = config.database;

const { rows } = await usersClient.getUsers({
database,
});

const userRow = rows.find(row => row.username === config.email);
expect(rows).toBeTruthy();
expect(userRow).toBeTruthy();
});
});

describe('addUserToDatabase', () => {
it('should return 200 and message', async () => {
const response = await usersClient.addUserToDatabase(config.database, testEmail);
const body = await response.json();
expect(response.status).toEqual(200);
expect(body.status).toEqual(UserApiResponseStatus.success);
});
});

describe('removeUserFromDatabase', () => {
it('should return 200 and message', async () => {
const { uId } = await await usersClient.addUserToDatabase(config.database, testEmail).then(response => response.json());
const response = await usersClient.removeUserFromDatabase(config.database, uId);
const body = await response.json();
expect(response.status).toEqual(200);
expect(body.status).toEqual(UserApiResponseStatus.success);
});
});

describe('updateUserForDatabase', () => {
it('should return 200 and message', async () => {
const { uId: uIdAdded } = await await usersClient.addUserToDatabase(config.database, testEmail).then(response => response.json());
const response = await usersClient.updateUserForDatabase(config.database, testEmail, false);
const body = await response.json();
expect(response.status).toEqual(200);
expect(body.status).toEqual(UserApiResponseStatus.success);
expect(uIdAdded).toEqual(body.uId);
});
});

describe('addUserToCompany', () => {
it('should return 200 and message', async () => {
const response = await usersClient.addUserToCompany(companyId, testEmail);
const body = await response.json();
expect(response.status).toEqual(200);
expect(body.status).not.toEqual(UserApiResponseStatus.fail);
});
});

describe('removeUserFromCompany', () => {
it('should return 200 and message', async () => {
const { uId: uIdAdded } = await await usersClient.addUserToCompany(companyId, testEmail).then(response => response.json());
const response = await usersClient.removeUserFromCompany(companyId, uIdAdded);
const body = await response.json();
expect(response.status).toEqual(200);
expect(body.status).not.toEqual(UserApiResponseStatus.fail);
});
});
});

async function getCompanyId(apiClient: BugSplatApiClient, database: string): Promise<number> {
const rows = await apiClient.fetch<Array<{ dbName: string, companyId: string }>>('/api/databases.php').then(response => response.json());
const row = rows.find(row => row.dbName === database);
if (!row?.companyId) {
throw new Error(`Could not find database ${database}`);
}
return Number(row.companyId);
}
Loading

0 comments on commit c730962

Please sign in to comment.