Skip to content

Commit

Permalink
feat(v2/storage): add tests for CsvGenerator classes (#3975)
Browse files Browse the repository at this point in the history
* ref: move CsvGenerator and EncryptedResponseCsvGenerator to own dir

in preparation for colocation of tests

* feat(CsvGenerator): add tests

* feat(EncryptedResponseCsvGenerator): add tests
  • Loading branch information
karrui authored Jun 14, 2022
1 parent 6ee7026 commit 7816b20
Show file tree
Hide file tree
Showing 9 changed files with 891 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
import { stringify } from 'csv-string'
import FileSaver from 'file-saver'
import { mocked } from 'ts-jest/utils'

import { CsvGenerator } from './CsvGenerator'

const UTF8_BYTE_ORDER_MARK = '\uFEFF'

jest.mock('file-saver')
const MockFileSaver = mocked(FileSaver)

describe('CsvGenerator', () => {
afterAll(() => {
jest.clearAllMocks()
})

describe('Constructor', () => {
it('should initialise the instance properties correctly with defaults if params are not passed to constructor', () => {
// Arrange
const csv = new CsvGenerator()

// Assert
expect(csv.expectedNumberOfRecords).toEqual(0)
expect(csv.numOfMetaDataRows).toEqual(0)
expect(csv.numOfHeaderRows).toEqual(1)
expect(csv.lastCreatedAt).toEqual(0)
expect(csv.startIdx).toEqual(2)
expect(csv.idx).toEqual(2)
expect(csv.records.length).toEqual(2)
expect(csv.records[0]).toEqual(UTF8_BYTE_ORDER_MARK)
})

it('should initialise the instance properties correctly if params are passed to constructor', () => {
// Arrange
const expectedNumberOfRecords = 1
const numOfMetaDataRows = 2
const csv = new CsvGenerator(expectedNumberOfRecords, numOfMetaDataRows)

// Assert
expect(csv.expectedNumberOfRecords).toEqual(expectedNumberOfRecords)
expect(csv.numOfMetaDataRows).toEqual(numOfMetaDataRows)
expect(csv.numOfHeaderRows).toEqual(1)
expect(csv.lastCreatedAt).toEqual(0)
expect(csv.startIdx).toEqual(numOfMetaDataRows + 2)
expect(csv.idx).toEqual(numOfMetaDataRows + 2)
expect(csv.records.length).toEqual(
expectedNumberOfRecords + numOfMetaDataRows + 2,
)
expect(csv.records[0]).toEqual(UTF8_BYTE_ORDER_MARK)
})
})

describe('addLine', () => {
it('should insert raw data of type string correctly', () => {
// Arrange
const expectedNumberOfRecords = 1
const numOfMetaDataRows = 0
const csv = new CsvGenerator(expectedNumberOfRecords, numOfMetaDataRows)
const lineToAdd = ['a', 'b']
const stringifiedData = stringify(lineToAdd)

// Act
csv.addLine(lineToAdd)

// Assert
expect(csv.idx).toEqual(numOfMetaDataRows + 3) // Add 3 because line added
expect(csv.records.length).toEqual(
expectedNumberOfRecords + numOfMetaDataRows + 2,
)
expect(csv.records[2]).toEqual(stringifiedData)
})

it('should insert raw data of type number correctly', () => {
// Arrange
const expectedNumberOfRecords = 1
const numOfMetaDataRows = 0
const csv = new CsvGenerator(expectedNumberOfRecords, numOfMetaDataRows)
const lineToAdd = [1, 2]
const stringifiedData = stringify(lineToAdd)

// Act
csv.addLine(lineToAdd)

// Assert
expect(csv.idx).toEqual(numOfMetaDataRows + 3) // Add 3 because line added
expect(csv.records.length).toEqual(numOfMetaDataRows + 3)
expect(csv.records[2]).toEqual(stringifiedData)
})
})

describe('setHeader', () => {
it('should set headers correctly', () => {
// Arrange
const expectedNumberOfRecords = 0
const numOfMetaDataRows = 0
const csv = new CsvGenerator(expectedNumberOfRecords, numOfMetaDataRows)
const headers = ['field1', 'field2']
const stringifiedHeaders = stringify(headers)

// Act
csv.setHeader(headers)

// Assert
expect(csv.records[1]).toEqual(stringifiedHeaders)
})
})

describe('addMetaData', () => {
it('should set metaData correctly for both string and numbers', () => {
// Arrange
const expectedNumberOfRecords = 1
const numOfMetaDataRows = 3
const csv = new CsvGenerator(expectedNumberOfRecords, numOfMetaDataRows)
const metaData = [
['metaData1a', 'metaData1b'],
[1, 2],
['metaData3a', 3],
]
const stringifiedMetaData = metaData.map((data) => stringify(data))

// Act
csv.addMetaData(metaData)

// Assert
expect(csv.records[1]).toEqual(stringifiedMetaData[0])
expect(csv.records[2]).toEqual(stringifiedMetaData[1])
expect(csv.records[3]).toEqual(stringifiedMetaData[2])
})
})

describe('triggerFileDownload', () => {
it('should call triggerFileDownload with the correct parameters', () => {
// Arrange
const expectedNumberOfRecords = 1
const numOfMetaDataRows = 0
const csv = new CsvGenerator(expectedNumberOfRecords, numOfMetaDataRows)
const lineToAdd = [1, 2]
const blob = new Blob(csv.records, {
type: 'text/csv;charset=utf-8',
})

// Act
csv.addLine(lineToAdd)
csv.triggerFileDownload('some filename')

// Assert
expect(MockFileSaver.saveAs).toHaveBeenCalledWith(blob, 'some filename')
})
})

describe('length', () => {
it('should corrently return length of csv file when header and meta data are empty', () => {
// Arrange
const expectedNumberOfRecords = 1
const numOfMetaDataRows = 0
const csv = new CsvGenerator(expectedNumberOfRecords, numOfMetaDataRows)
const lineToAdd = [1, 2]

// Act
csv.addLine(lineToAdd)

// Assert
expect(csv.length()).toEqual(expectedNumberOfRecords)
})

it('should corrently return length of csv file when header and meta data are present', () => {
// Arrange
const expectedNumberOfRecords = 1
const numOfMetaDataRows = 1
const csv = new CsvGenerator(expectedNumberOfRecords, numOfMetaDataRows)
const lineToAdd = [1, 2]
const metaData = [['metaData1a', 'metaData1b']]
const headers = ['field1', 'field2']

// Act
csv.addLine(lineToAdd)
csv.setHeader(headers)
csv.addMetaData(metaData)

// Assert
expect(csv.length()).toEqual(expectedNumberOfRecords)
})
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { CsvGenerator } from './CsvGenerator'
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export * from './CsvGenerator.class'
export * from './CsvGenerator'
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,14 @@ export type AttachmentsDownloadMap = Map<
{ url: string; filename?: string }
>

export type CsvRecordData = FormField

export type DecryptedSubmissionData = {
created: string
submissionId: string
record: FormField[]
record: CsvRecordData[]
}

export type CsvRecordData = FormField

export type MaterializedCsvRecord = SetRequired<CsvRecord, 'submissionData'>

export type LineData = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { useAdminForm } from '~features/admin-form/common/queries'
import { useFormResponsesCount } from '../../queries'

import { downloadResponseAttachment } from './utils/downloadCsv'
import { EncryptedResponseCsvGenerator } from './utils/EncryptedResponseCsvGenerator.class'
import { EncryptedResponseCsvGenerator } from './utils/EncryptedResponseCsvGenerator'
import {
EncryptedResponsesStreamParams,
getEncryptedResponsesStream,
Expand Down
Loading

0 comments on commit 7816b20

Please sign in to comment.