Skip to content

Commit 999f3cc

Browse files
authored
Bobbyg603/issue19 (#40)
* Adds Crashes client support * Fixes TODO in e2e test Fixes #19 * Removes unused import from table data client * Removes TODO that had already been addressed * Addresses todo in crashes api row * Removes non-existent event property from crashes api row * Cleans up imports Adds tsconfig paths. Adds index files to export public types. * Lint fixes
1 parent 599040c commit 999f3cc

File tree

58 files changed

+1127
-131
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+1127
-131
lines changed

package-lock.json

+80-7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+6-5
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
],
1010
"scripts": {
1111
"pretest": "npm run lint:fix",
12-
"test": "ts-node node_modules/jasmine/bin/jasmine --config=spec/support/jasmine.spec.json",
13-
"test:teamcity": "ts-node node_modules/jasmine/bin/jasmine --config=spec/support/jasmine.teamcity.spec.json",
12+
"test": "ts-node -r tsconfig-paths/register node_modules/jasmine/bin/jasmine --config=spec/support/jasmine.spec.json",
13+
"test:teamcity": "ts-node -r tsconfig-paths/register node_modules/jasmine/bin/jasmine --config=spec/support/jasmine.teamcity.spec.json",
1414
"lint": "eslint . --ext .js,.ts",
1515
"lint:fix": "npm run lint -- --fix",
16-
"e2e": "ts-node node_modules/jasmine/bin/jasmine --config=spec/support/jasmine.e2e.json",
17-
"e2e:teamcity": "ts-node node_modules/jasmine/bin/jasmine --config=spec/support/jasmine.teamcity.e2e.json",
16+
"e2e": "ts-node -r tsconfig-paths/register node_modules/jasmine/bin/jasmine --config=spec/support/jasmine.e2e.json",
17+
"e2e:teamcity": "ts-node -r tsconfig-paths/register node_modules/jasmine/bin/jasmine --config=spec/support/jasmine.teamcity.e2e.json",
1818
"release": "npm run build && npm publish --access public",
1919
"build": "npm run build:cjs && npm run build:esm",
2020
"build:cjs": "tsc -p tsconfig.cjs.json",
@@ -48,6 +48,7 @@
4848
"jasmine": "^3.7.0",
4949
"jasmine-reporters": "^2.4.0",
5050
"ts-node": "^10.0.0",
51-
"typescript": "^4.2.4"
51+
"tsconfig-paths": "^3.11.0",
52+
"typescript": "^4.4.3"
5253
}
5354
}

spec/fakes/crash/crash-api-response.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { GroupableThreadCollection, ProcessingStatus } from '../../../src/crash';
2-
import { EventType } from '../../../src/events/events-api-client/events-api-client';
3-
import { createFakeEvents } from '../events/events';
1+
import { GroupableThreadCollection, ProcessingStatus } from '@crash';
2+
import { EventType } from '@events';
3+
import { createFakeEvents } from '@spec/fakes/events/events';
44

55
export const createFakeCrashApiResponse = () => ({
66
processed: ProcessingStatus.Complete,
File renamed without changes.

src/common/bugsplat-api-client.e2e.ts renamed to src/common/client/bugsplat-api-client.e2e.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { BugSplatApiClient } from '.';
2-
import { config } from '../../spec/config';
1+
import { BugSplatApiClient } from '@common';
2+
import { config } from '@spec/config';
33

44
describe('BugSplatApiClient', () => {
55
let client: BugSplatApiClient;
@@ -22,7 +22,7 @@ describe('BugSplatApiClient', () => {
2222
try {
2323
await client.login(email, 'password');
2424
fail('login was supposed to throw!');
25-
} catch (error) {
25+
} catch (error: any) {
2626
expect(error.message).toMatch(/Invalid email or password/);
2727
}
2828
});

src/common/bugsplat-api-client.spec.ts renamed to src/common/client/bugsplat-api-client.spec.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import { BugSplatApiClient } from '.';
2-
import { config } from '../../spec/config';
3-
import { createFakeResponseBody } from '../../spec/fakes/common/response';
4-
import { Environment } from './environment';
1+
import { BugSplatApiClient, Environment } from '@common';
2+
import { config } from '@spec/config';
3+
import { createFakeResponseBody } from '@spec/fakes/common/response';
54

65
describe('BugSplatApiClient', () => {
76
const email = '[email protected]';

src/common/bugsplat-api-client.ts renamed to src/common/client/bugsplat-api-client.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1+
import { ApiClient, BugSplatResponse, Environment } from '@common';
12
import fetchPonyfill from 'fetch-ponyfill';
23
import FormData from 'form-data';
3-
import { ApiClient, Environment } from '.';
4-
import { BugSplatResponse } from './api-client';
54

65
export class BugSplatApiClient implements ApiClient {
76
private _createFormData = () => new FormData();
@@ -12,7 +11,7 @@ export class BugSplatApiClient implements ApiClient {
1211
private _host: string = 'https://app.bugsplat.com',
1312
private _environment: Environment = Environment.Node
1413
) { }
15-
14+
1615
static async createAuthenticatedClientForNode(
1716
host: string,
1817
email: string,

src/common/client/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export { ApiClient, BugSplatResponse } from './api-client';
2+
export { BugSplatApiClient } from './bugsplat-api-client';

src/common/data/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './search';
2+
export * from './table-data';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export const EQUAL = 'EQUAL';
2+
export const NOT_EQUAL = 'NOT_EQUAL';
3+
export const CONTAINS = 'CONTAINS';
4+
export const DOES_NOT_CONTAIN = 'DOES_NOT_CONTAIN';
5+
export const EMPTY = 'EMPTY';
6+
export const NOT_EMPTY = 'NOT_EMPTY';
7+
export const STARTS_WITH = 'STARTS_WITH';
8+
export const ENDS_WITH = 'ENDS_WITH';
9+
export const LESS_THAN = 'LESS_THAN';
10+
export const GREATER_THAN = 'GREATER_THAN';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { ApiDataFilter, EQUAL, FilterOperator, GREATER_THAN, LESS_THAN } from '@common';
2+
3+
export class ApiDataFilterGroup {
4+
constructor(
5+
public filters: Array<ApiDataFilter>,
6+
public filterOperator: FilterOperator = FilterOperator.and,
7+
public groupOperator: FilterOperator = FilterOperator.and
8+
) {
9+
Object.freeze(this);
10+
}
11+
12+
static fromApiTableFilter(filter: ApiDataFilter): ApiDataFilterGroup {
13+
return new ApiDataFilterGroup([filter]);
14+
}
15+
16+
static fromColumnValues(
17+
values: Array<string>,
18+
columnName: string,
19+
filterOperator: FilterOperator = FilterOperator.or
20+
): ApiDataFilterGroup {
21+
return new ApiDataFilterGroup(values.map(value => new ApiDataFilter(value, EQUAL, columnName)), filterOperator);
22+
}
23+
24+
static fromTimeFrame(columnName: string, startDate?: Date, endDate?: Date): ApiDataFilterGroup {
25+
const filters: Array<ApiDataFilter> = [];
26+
27+
if (startDate) {
28+
filters.push(new ApiDataFilter(startDate.toISOString(), GREATER_THAN, columnName));
29+
}
30+
31+
if (endDate) {
32+
filters.push(new ApiDataFilter(endDate.toISOString(), LESS_THAN, columnName));
33+
}
34+
35+
return new ApiDataFilterGroup(filters);
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { ApiDataFilter, ApiDataFilterGroup, FilterOperator } from '@common';
2+
3+
describe('ApiDataFilterGroup', () => {
4+
describe('fromApiDataFilter', () => {
5+
it('should return filter group containing filter, filter operator and group operator', () => {
6+
const filter = new ApiDataFilter('value', 'condition', 'field');
7+
8+
const result = ApiDataFilterGroup.fromApiTableFilter(filter);
9+
10+
expect(result.groupOperator).toEqual(FilterOperator.and);
11+
expect(result.filterOperator).toEqual(FilterOperator.and);
12+
expect(result.filters).toEqual([filter]);
13+
});
14+
});
15+
16+
describe('fromColumnValues', () => {
17+
it('should return filter group containing filters, filter operators and group operator', () => {
18+
const column = 'Camp Granada';
19+
const values = ['hello', 'muddah', 'hello', 'fadduh'];
20+
21+
const result = ApiDataFilterGroup.fromColumnValues(values, column, FilterOperator.or);
22+
23+
expect(result.groupOperator).toEqual(FilterOperator.and);
24+
expect(result.filterOperator).toEqual(FilterOperator.or);
25+
result.filters.forEach((filter, i) => {
26+
expect(filter.filterDataField).toEqual(column);
27+
expect(filter.filterCondition).toEqual('EQUAL');
28+
expect(filter.filterValue).toEqual(values[i]);
29+
});
30+
});
31+
});
32+
33+
describe('fromTimeFrame', () => {
34+
it('should return filter group containing filters, filter operators, and group operator', () => {
35+
const startDate = new Date();
36+
const endDate = new Date();
37+
38+
const result = ApiDataFilterGroup.fromTimeFrame('crashTime', startDate, endDate);
39+
40+
expect(result.filters.length).toEqual(2);
41+
expect(result.filterOperator).toEqual(FilterOperator.and);
42+
expect(result.groupOperator).toEqual(FilterOperator.and);
43+
expect(result.filters[0].filterCondition).toEqual('GREATER_THAN');
44+
expect(result.filters[0].filterDataField).toEqual('crashTime');
45+
expect(result.filters[0].filterValue).toEqual(startDate.toISOString());
46+
expect(result.filters[1].filterCondition).toEqual('LESS_THAN');
47+
expect(result.filters[1].filterDataField).toEqual('crashTime');
48+
expect(result.filters[1].filterValue).toEqual(endDate.toISOString());
49+
});
50+
51+
it('should return empty filter group if startDate and endDate are falsy', () => {
52+
const result = ApiDataFilterGroup.fromTimeFrame('crashTime');
53+
54+
expect(result.filters.length).toEqual(0);
55+
});
56+
});
57+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export class FilterOperator {
2+
public static readonly and = new FilterOperator('0');
3+
public static readonly or = new FilterOperator('1');
4+
private constructor(public value: string) { }
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export class ApiDataFilter {
2+
constructor(
3+
public readonly filterValue: string,
4+
public readonly filterCondition: string,
5+
public readonly filterDataField: string
6+
) {
7+
Object.freeze(this);
8+
}
9+
}
10+
11+

src/common/data/search/index.ts

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export * from './filter-condition/filter-condition';
2+
export { ApiDataFilterGroup } from './filter-group/api-data-filter-group';
3+
export { FilterOperator } from './filter-operator/filter-operator';
4+
export { ApiDataFilter } from './filter/api-data-filter';
5+
export { OrderFilter } from './order-filter/order-filter';
6+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { OrderFilter } from '@common';
2+
3+
describe('OrderFilter', () => {
4+
it('should exist', () => {
5+
expect(OrderFilter).toEqual(jasmine.any(Function));
6+
});
7+
8+
it('should have static properties', () => {
9+
expect(OrderFilter.ascending).toEqual(jasmine.any(OrderFilter));
10+
expect(OrderFilter.descending).toEqual(jasmine.any(OrderFilter));
11+
expect(OrderFilter.none).toEqual(jasmine.any(OrderFilter));
12+
});
13+
});

0 commit comments

Comments
 (0)