Extract reference validation helpers for unit test isolation

This commit is contained in:
karilint
2026-03-17 18:01:33 +02:00
parent a1a9990ee4
commit c38b3f280a
4 changed files with 56 additions and 49 deletions
+1 -2
View File
@@ -7,11 +7,10 @@ import {
getReferenceJournals,
getReferenceLocalities,
getReferenceSpecies,
buildReferenceDisplayLabelMap,
validateEntireReference,
getAuthorsOfReference,
getJournalById,
} from '../services/reference'
import { buildReferenceDisplayLabelMap, validateEntireReference } from '../services/referenceValidation'
import { requireOneOf } from '../middlewares/authorizer'
import { Role, EditMetaData, ReferenceDetailsType, EditDataType } from '../../../frontend/src/shared/types'
import { deleteReference, writeReference } from '../services/write/reference'
+6 -46
View File
@@ -1,17 +1,10 @@
import { nowDb } from '../utils/db'
import { EditDataType, ReferenceDetailsType } from '../../../frontend/src/shared/types'
import { ValidationObject } from '../../../frontend/src/shared/validators/validator'
import {
ReferenceDisplayLabelMap,
ReferenceFieldDisplayNames,
validateReference,
} from '../../../frontend/src/shared/validators/reference'
import { type ref_ref } from '../../prisma/generated/now_test_client'
import { TabListQueryOptions } from './tabularQuery'
type ReferenceTypeFieldName = { field_name: string | null; ref_field_name: string | null }
export type ReferenceTypeWithFieldNames = { ref_type_id: number; ref_field_name: ReferenceTypeFieldName[] }
import {
buildReferenceDisplayLabelMap,
type ReferenceTypeWithFieldNames,
validateEntireReference,
} from './referenceValidation'
export const getAllReferences = async () => {
const result = await nowDb.ref_ref.findMany({
@@ -118,28 +111,6 @@ export const getReferenceTypes = async (): Promise<ReferenceTypeWithFieldNames[]
return referenceTypes
}
export const buildReferenceDisplayLabelMap = (
referenceTypes: ReferenceTypeWithFieldNames[]
): ReferenceDisplayLabelMap => {
const labelMap: ReferenceDisplayLabelMap = {}
referenceTypes.forEach(referenceType => {
const labelsForType = referenceType.ref_field_name.reduce<ReferenceFieldDisplayNames>((typeLabels, field) => {
if (field.field_name && field.ref_field_name) {
typeLabels[field.field_name as keyof ReferenceFieldDisplayNames] = field.ref_field_name
}
return typeLabels
}, {})
if (Object.keys(labelsForType).length > 0) {
labelMap[referenceType.ref_type_id] = labelsForType
}
})
return labelMap
}
export const getReferenceAuthors = async () => {
const uniqueReferenceAuthors = await nowDb.ref_authors.groupBy({
by: ['author_surname', 'author_initials'],
@@ -185,15 +156,4 @@ export const getReferenceJournals = async () => {
return referenceJournalTypes
}
export const validateEntireReference = (
editedFields: EditDataType<ref_ref>,
options?: { displayLabelMap?: ReferenceDisplayLabelMap }
) => {
const keys = Object.keys(editedFields as Record<string, unknown>) as (keyof EditDataType<ReferenceDetailsType>)[]
const errors: ValidationObject[] = []
for (const key of keys) {
const error = validateReference(editedFields as EditDataType<ReferenceDetailsType>, key, options)
if (error.error) errors.push(error)
}
return errors
}
export { buildReferenceDisplayLabelMap, validateEntireReference }
@@ -0,0 +1,48 @@
import { EditDataType, ReferenceDetailsType } from '../../../frontend/src/shared/types'
import { ValidationObject } from '../../../frontend/src/shared/validators/validator'
import {
ReferenceDisplayLabelMap,
ReferenceFieldDisplayNames,
validateReference,
} from '../../../frontend/src/shared/validators/reference'
type ReferenceTypeFieldName = { field_name: string | null; ref_field_name: string | null }
export type ReferenceTypeWithFieldNames = { ref_type_id: number; ref_field_name: ReferenceTypeFieldName[] }
export const buildReferenceDisplayLabelMap = (
referenceTypes: ReferenceTypeWithFieldNames[]
): ReferenceDisplayLabelMap => {
const labelMap: ReferenceDisplayLabelMap = {}
referenceTypes.forEach(referenceType => {
const labelsForType = referenceType.ref_field_name.reduce<ReferenceFieldDisplayNames>((typeLabels, field) => {
if (field.field_name && field.ref_field_name) {
typeLabels[field.field_name as keyof ReferenceFieldDisplayNames] = field.ref_field_name
}
return typeLabels
}, {})
if (Object.keys(labelsForType).length > 0) {
labelMap[referenceType.ref_type_id] = labelsForType
}
})
return labelMap
}
export const validateEntireReference = (
editedFields: EditDataType<ReferenceDetailsType>,
options?: { displayLabelMap?: ReferenceDisplayLabelMap }
) => {
const keys = Object.keys(editedFields as Record<string, unknown>) as (keyof EditDataType<ReferenceDetailsType>)[]
const errors: ValidationObject[] = []
for (const key of keys) {
const error = validateReference(editedFields, key, options)
if (error.error) errors.push(error)
}
return errors
}
@@ -4,7 +4,7 @@ import {
buildReferenceDisplayLabelMap,
validateEntireReference,
type ReferenceTypeWithFieldNames,
} from '../../services/reference'
} from '../../services/referenceValidation'
import { EditDataType, ReferenceDetailsType } from '../../../../frontend/src/shared/types'
const electronicCitationReferenceType: ReferenceTypeWithFieldNames = {