Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

API tests #580

Merged
merged 4 commits into from
Oct 12, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
240 changes: 238 additions & 2 deletions api/src/utils/media/csv/validation/csv-row-validator.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ import { expect } from 'chai';
import { describe } from 'mocha';
import xlsx from 'xlsx';
import { CSVWorksheet } from '../csv-file';
import { getCodeValueFieldsValidator, getRequiredFieldsValidator } from './csv-row-validator';
import {
getCodeValueFieldsValidator,
getRequiredFieldsValidator,
getValidRangeFieldsValidator
} from './csv-row-validator';

describe('getRequiredFieldsValidator', () => {
it('adds no errors when required fields are not provided', () => {
Expand All @@ -22,6 +26,19 @@ describe('getRequiredFieldsValidator', () => {
expect(csvWorkSheet.csvValidation.rowErrors).to.eql([]);
});

it('adds no errors when header does not exist', () => {
const requiredFieldsByHeader: string[] = ['Header1', 'Header2']; // fields for these headers are required
const validator = getRequiredFieldsValidator(requiredFieldsByHeader);

const xlsxWorkSheet = xlsx.utils.aoa_to_sheet([[], [5]]);

const csvWorkSheet = new CSVWorksheet('Sheet1', xlsxWorkSheet);

validator(csvWorkSheet);

expect(csvWorkSheet.csvValidation.rowErrors).to.eql([]);
});

it('adds errors for every field if required fields are provided and there are zero data rows in the worksheet', () => {
const requiredFieldsByHeader: string[] = ['Header1', 'Header2']; // fields for these headers are required

Expand Down Expand Up @@ -92,14 +109,44 @@ describe('getRequiredFieldsValidator', () => {
});

describe('getCodeValueFieldsValidator', () => {
it('adds no errors when no required code values are not provided', () => {
it('adds no errors when header does not exist', () => {
const requiredCodeValuesByHeader = {
columnName: 'Header1',
column_code_validator: { allowed_code_values: [{ name: 'Code1' }, { name: 'Code2' }] }
};

const validator = getCodeValueFieldsValidator(requiredCodeValuesByHeader);

const xlsxWorkSheet = xlsx.utils.aoa_to_sheet([[], [5]]);

const csvWorkSheet = new CSVWorksheet('Sheet1', xlsxWorkSheet);

validator(csvWorkSheet);

expect(csvWorkSheet.csvValidation.rowErrors).to.eql([]);
});

it('adds no errors when code values are empty', () => {
const requiredCodeValuesByHeader = {
columnName: 'Header1',
column_code_validator: { allowed_code_values: [] }
};

const validator = getCodeValueFieldsValidator(requiredCodeValuesByHeader);

const xlsxWorkSheet = xlsx.utils.aoa_to_sheet([[], [5]]);

const csvWorkSheet = new CSVWorksheet('Sheet1', xlsxWorkSheet);

validator(csvWorkSheet);

expect(csvWorkSheet.csvValidation.rowErrors).to.eql([]);
});
it('adds no errors when no required code values are provided', () => {
const requiredCodeValuesByHeader = undefined;

const validator = getCodeValueFieldsValidator(requiredCodeValuesByHeader);

const xlsxWorkSheet = xlsx.utils.aoa_to_sheet([
['Header1', 'Header2'],
['Header1Data', 'Header2Data']
Expand Down Expand Up @@ -179,3 +226,192 @@ describe('getCodeValueFieldsValidator', () => {
expect(csvWorkSheet.csvValidation.rowErrors).to.eql([]);
});
});

describe('getValidRangeFieldsValidator', () => {
it('adds no errors when no code value range is not provided', () => {
const codeValuesRangeByHeader = undefined;

const validator = getValidRangeFieldsValidator(codeValuesRangeByHeader);

const xlsxWorkSheet = xlsx.utils.aoa_to_sheet([['Header1'], []]);

const csvWorkSheet = new CSVWorksheet('Sheet1', xlsxWorkSheet);

validator(csvWorkSheet);

expect(csvWorkSheet.csvValidation.rowErrors).to.eql([]);
});

it('adds no errors when header does not exist', () => {
const codeValuesRangeByHeader = {
columnName: 'Header1',
column_range_validator: {
min_value: 1,
max_value: 10
}
};

const validator = getValidRangeFieldsValidator(codeValuesRangeByHeader);

const xlsxWorkSheet = xlsx.utils.aoa_to_sheet([[], [5]]);

const csvWorkSheet = new CSVWorksheet('Sheet1', xlsxWorkSheet);

validator(csvWorkSheet);

expect(csvWorkSheet.csvValidation.rowErrors).to.eql([]);
});

it('adds no errors when valid value range is provided', () => {
const codeValuesRangeByHeader = {
columnName: 'Header1',
column_range_validator: {
min_value: 1,
max_value: 10
}
};

const validator = getValidRangeFieldsValidator(codeValuesRangeByHeader);

const xlsxWorkSheet = xlsx.utils.aoa_to_sheet([['Header1'], [6]]);

const csvWorkSheet = new CSVWorksheet('Sheet1', xlsxWorkSheet);

validator(csvWorkSheet);

expect(csvWorkSheet.csvValidation.rowErrors).to.eql([]);
});

it('adds an out of range error when value provided exceeds range', () => {
const codeValuesRangeByHeader = {
columnName: 'Header1',
column_range_validator: {
min_value: 1,
max_value: 10
}
};

const validator = getValidRangeFieldsValidator(codeValuesRangeByHeader);

const xlsxWorkSheet = xlsx.utils.aoa_to_sheet([['Header1'], [11]]);

const csvWorkSheet = new CSVWorksheet('Sheet1', xlsxWorkSheet);

validator(csvWorkSheet);

expect(csvWorkSheet.csvValidation.rowErrors).to.eql([
{
col: 'Header1',
errorCode: 'Out of Range',
message: 'Invalid value: 11. Value must be between 1 and 10 ',
row: 2
}
]);
});

it('adds an out of range error when value provided is less than the range', () => {
const codeValuesRangeByHeader = {
columnName: 'Header1',
column_range_validator: {
min_value: 5,
max_value: 10
}
};

const validator = getValidRangeFieldsValidator(codeValuesRangeByHeader);

const xlsxWorkSheet = xlsx.utils.aoa_to_sheet([['Header1'], [1]]);

const csvWorkSheet = new CSVWorksheet('Sheet1', xlsxWorkSheet);

validator(csvWorkSheet);

expect(csvWorkSheet.csvValidation.rowErrors).to.eql([
{
col: 'Header1',
errorCode: 'Out of Range',
message: 'Invalid value: 1. Value must be between 5 and 10 ',
row: 2
}
]);
});

it('adds an out of range error when value provided is greater than the max_value, and only max_value is provided', () => {
const codeValuesRangeByHeader = {
columnName: 'Header1',
column_range_validator: {
max_value: 10
}
};

const validator = getValidRangeFieldsValidator(codeValuesRangeByHeader);

const xlsxWorkSheet = xlsx.utils.aoa_to_sheet([['Header1'], [11]]);

const csvWorkSheet = new CSVWorksheet('Sheet1', xlsxWorkSheet);

validator(csvWorkSheet);

expect(csvWorkSheet.csvValidation.rowErrors).to.eql([
{
col: 'Header1',
errorCode: 'Out of Range',
message: 'Invalid value: 11. Value must be less than 10 ',
row: 2
}
]);
});

it('adds an out of range error when value provided is less than the min_value, and only the min-value is specified', () => {
const codeValuesRangeByHeader = {
columnName: 'Header1',
column_range_validator: {
min_value: 5
}
};

const validator = getValidRangeFieldsValidator(codeValuesRangeByHeader);

const xlsxWorkSheet = xlsx.utils.aoa_to_sheet([['Header1'], [4]]);

const csvWorkSheet = new CSVWorksheet('Sheet1', xlsxWorkSheet);

validator(csvWorkSheet);

expect(csvWorkSheet.csvValidation.rowErrors).to.eql([
{
col: 'Header1',
errorCode: 'Out of Range',
message: 'Invalid value: 4. Value must be greater than 5 ',
row: 2
}
]);
});

it('adds an invalid value error when value provided is not a number', () => {
const codeValuesRangeByHeader = {
columnName: 'Header1',
column_range_validator: {
min_value: 5,
max_vlaue: 10
}
};

const validator = getValidRangeFieldsValidator(codeValuesRangeByHeader);

const xlsxWorkSheet = xlsx.utils.aoa_to_sheet([['Header1'], ['a']]);

const csvWorkSheet = new CSVWorksheet('Sheet1', xlsxWorkSheet);

validator(csvWorkSheet);

expect(csvWorkSheet.csvValidation.rowErrors).to.eql([
{
col: 'Header1',
errorCode: 'Invalid Value',
message: 'Invalid value: a. Value must be a number ',
row: 2
}
]);
});
});