Как мне проверить обязательное свойство дополнительного ключа в Joi? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть следующая схема Typescript:

export interface LiveDate {
  production: string,
  test?: string
}

interface Widget {
  name: string,
  path: string
}

interface Manifest {
  livedate?: LiveDate,
  'trusted-types'?: string[],
  widgets?: Widget[]
}

И следующая схема Joi:

const liveDateSchema: Joi.ObjectSchema = Joi.object<LiveDate>().keys({
  production: Joi.date().iso().required(),
  test: Joi.date().iso().optional()
})

const widgetSchema: Joi.ObjectSchema<Widget> = Joi.object<Widget>().keys({
  name: Joi.string().required(),
  path: Joi.string().required()
})

const manifestSchema: Joi.ObjectSchema<Manifest> = Joi.object<Manifest>().keys({
  'livedate': liveDateSchema.optional(),
  'trusted-types': Joi.string().optional(),
  'widgets': Joi.array().items(widgetSchema).optional()
})

Я не совсем понимаю, как настроить условное logi c (приношу свои извинения за то, что это ссылка с версией), так что если присутствует livedate, то Joi должен подтвердить, что livedate.production - это строка даты ISO. В его нынешнем виде, если я установил livedate.production на not a date string, мой тест по-прежнему проходит, и я думаю, это связано с тем, что livedate помечен как optional в моем объекте manifestSchema, поэтому он не выполняет проверку даты.

1 Ответ

0 голосов
/ 12 мая 2020

Так что то, что у меня есть, правильно. Вот тест Jest:

  it('should fail validation if livedate.production is present but not an ISO-8601 date', () => {
    const manifest: Manifest = {
      livedate: {
        production: 'not an ISO date string'
      }
    }
    const outputLocation = path.join(__dirname, 'test-directory')

    expect(() => createManifest(manifest, outputLocation)).toThrowError(getISODateErrorMessage('livedate.production'))
  })

Где getISODateErrorMessage - это просто утилита для возврата сообщения об ошибке Joi.

Я видел проблемы, когда звонил .toThrowError('') (пока построение этого теста) в том смысле, что тест был пройден, но не должен был пройти. Мне не удалось это отследить, поскольку сообщение об ошибке из schema.validate было правильным и не пустым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...