Skip to content

Commit

Permalink
test: improve validation tests
Browse files Browse the repository at this point in the history
  • Loading branch information
falkoschumann committed Jun 19, 2024
1 parent f37db2e commit 7437d3c
Show file tree
Hide file tree
Showing 7 changed files with 360 additions and 34 deletions.
17 changes: 16 additions & 1 deletion packages/shared/src/validation.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,19 @@ export function validateRequiredProperty(
);
}

return validateTypedProperty(
const value = validateTypedProperty(
object,
objectName,
propertyName,
propertyType,
itemType,
);

if (propertyType === 'string') {
validateNotEmpty(object, objectName, propertyName);
}

return value;
}

export function validateOptionalProperty(
Expand Down Expand Up @@ -56,6 +62,15 @@ export function validateOptionalProperty(
);
}

function validateNotEmpty(object, objectName, propertyName) {
const value = object[propertyName];
if (value === '') {
throw new ValidationError(
`The property "${propertyName}" of ${objectName} must not be empty.`,
);
}
}

function isPresent(value) {
return value !== null && value !== undefined;
}
Expand Down
10 changes: 7 additions & 3 deletions packages/shared/test/configurable-responses.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ describe('Configurable responses', () => {
test('Throws error if no value is given', () => {
const responses = ConfigurableResponses.create();

expect(() => responses.next()).toThrow('No more responses configured.');
expect(() => responses.next()).toThrow(
new Error('No more responses configured.'),
);
});
});

Expand All @@ -36,14 +38,16 @@ describe('Configurable responses', () => {
responses.next();

expect(() => responses.next()).toThrow(
'No more responses configured in foobar.',
new Error('No more responses configured in foobar.'),
);
});

test('Throws error if array is empty', () => {
const responses = ConfigurableResponses.create([]);

expect(() => responses.next()).toThrow('No more responses configured.');
expect(() => responses.next()).toThrow(
new Error('No more responses configured.'),
);
});
});
});
8 changes: 8 additions & 0 deletions packages/shared/test/validation.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,14 @@ describe('Validation', () => {
new Error('The property "name" is required for user.'),
);
});

test('Fails when string property is empty', () => {
const user = { name: '' };

expect(() =>
validateRequiredProperty(user, 'user', 'name', 'string'),
).toThrow(new Error('The property "name" of user must not be empty.'));
});
});

describe('Optional property', () => {
Expand Down
12 changes: 6 additions & 6 deletions packages/webserver/src/infrastructure/repository.js
Original file line number Diff line number Diff line change
Expand Up @@ -154,37 +154,37 @@ export class ActivityLoggedDto {
validate() {
const timestamp = validateRequiredProperty(
this,
'activity logged',
'ActivityLogged',
'Timestamp',
Date,
);
const duration = validateRequiredProperty(
this,
'activity logged',
'ActivityLogged',
'Duration',
Duration,
);
const client = validateRequiredProperty(
this,
'activity logged',
'ActivityLogged',
'Client',
'string',
);
const project = validateRequiredProperty(
this,
'activity logged',
'ActivityLogged',
'Project',
'string',
);
const task = validateRequiredProperty(
this,
'activity logged',
'ActivityLogged',
'Task',
'string',
);
const notes = validateOptionalProperty(
this,
'activity logged',
'ActivityLogged',
'Notes',
'string',
);
Expand Down
20 changes: 10 additions & 10 deletions packages/webserver/src/ui/activities-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export class ActivitiesController {
}
}

class LogActivityDto {
export class LogActivityDto {
static create({ timestamp, duration, client, project, task, notes }) {
return new LogActivityDto(
timestamp,
Expand Down Expand Up @@ -78,37 +78,37 @@ class LogActivityDto {
validate() {
const timestamp = validateRequiredProperty(
this,
'log activity',
'LogActivity',
'timestamp',
Date,
);
const duration = validateRequiredProperty(
this,
'log activity',
'LogActivity',
'duration',
Duration,
);
const client = validateRequiredProperty(
this,
'log activity',
'LogActivity',
'client',
'string',
);
const project = validateRequiredProperty(
this,
'log activity',
'LogActivity',
'project',
'string',
);
const task = validateRequiredProperty(
this,
'log activity',
'LogActivity',
'task',
'string',
);
const notes = validateOptionalProperty(
this,
'log activity',
'LogActivity',
'notes',
'string',
);
Expand All @@ -123,8 +123,8 @@ class LogActivityDto {
}
}

class RecentActivitiesQueryDto {
static create({ today }) {
export class RecentActivitiesQueryDto {
static create({ today } = {}) {
return new RecentActivitiesQueryDto(today);
}

Expand All @@ -135,7 +135,7 @@ class RecentActivitiesQueryDto {
validate() {
const today = validateOptionalProperty(
this,
'recent activities query',
'RecentActivitiesQuery',
'today',
Date,
);
Expand Down
Loading

0 comments on commit 7437d3c

Please sign in to comment.