| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- import { zz } from '../../../zodHelpers'
- import { describe, expect, it } from 'vitest'
- import mongodb from 'mongodb'
- const { ObjectId } = mongodb
- describe('zodHelpers', () => {
- describe('objectId', () => {
- it('fails to parse when provided with an invalid ObjectId', () => {
- const parsed = zz.objectId().safeParse('aa')
- expect(parsed.success).toBe(false)
- expect(parsed.error?.issues).toHaveLength(1)
- expect(parsed.error?.issues).toMatchObject([
- expect.objectContaining({
- message: 'invalid Mongo ObjectId',
- }),
- ])
- })
- it('parses successfully when provided with a valid ObjectId', () => {
- const parsed = zz.objectId().safeParse('507f1f77bcf86cd799439011')
- expect(parsed.success).toBe(true)
- expect(parsed.data).toBe('507f1f77bcf86cd799439011')
- })
- })
- describe('coercedObjectId', () => {
- it('fails to parse when provided with an invalid ObjectId', () => {
- const parsed = zz.coercedObjectId().safeParse('aa')
- expect(parsed.success).toBe(false)
- expect(parsed.error?.issues).toHaveLength(1)
- expect(parsed.error?.issues).toMatchObject([
- expect.objectContaining({
- message: 'invalid Mongo ObjectId',
- }),
- ])
- })
- it('parses to an ObjectId when provided with a valid ObjectId string', () => {
- const parsed = zz.coercedObjectId().safeParse('507f1f77bcf86cd799439011')
- expect(parsed.success).toBe(true)
- expect(parsed.data).toBeInstanceOf(ObjectId)
- expect(parsed.data?.toString()).toBe('507f1f77bcf86cd799439011')
- })
- })
- describe('datetime', () => {
- it('parses valid ISO 8601 datetime strings', () => {
- const parsed = zz.datetime().safeParse('2024-01-01T12:00:00Z')
- expect(parsed.success).toBe(true)
- expect(parsed.data).toEqual(new Date('2024-01-01T12:00:00Z'))
- })
- it('parses a valid ISO 8601 datetime with offset', () => {
- const parsed = zz
- .datetime({ offset: true })
- .safeParse('2024-01-01T12:00:00+00:00')
- expect(parsed.success).toBe(true)
- expect(parsed.data).toEqual(new Date('2024-01-01T12:00:00+00:00'))
- })
- it('parses a valid Date object', () => {
- const date = new Date('2024-01-01T12:00:00Z')
- const parsed = zz.datetime().safeParse(date)
- expect(parsed.success).toBe(true)
- expect(parsed.data).toEqual(date)
- })
- it('fails to parse datetime with offset when offset option is false', () => {
- const parsed = zz
- .datetime({ offset: false })
- .safeParse('2024-01-01T12:00:00+00:00')
- expect(parsed.success).toBe(false)
- expect(parsed.error?.issues).toHaveLength(1)
- expect(parsed.error?.issues).toMatchObject([
- expect.objectContaining({
- code: 'invalid_format',
- format: 'datetime',
- message: 'Invalid ISO datetime',
- }),
- ])
- })
- it('fails to parse null when schema is not nullable', () => {
- const parsed = zz.datetime().safeParse(null)
- expect(parsed.success).toBe(false)
- expect(parsed.error?.message).toContain(
- 'Invalid input: expected date, received null'
- )
- })
- it('fails to parse invalid datetime strings', () => {
- const parsed = zz.datetime().safeParse('invalid-datetime')
- expect(parsed.success).toBe(false)
- expect(parsed.error?.issues).toHaveLength(1)
- expect(parsed.error?.issues).toMatchObject([
- expect.objectContaining({
- code: 'invalid_format',
- format: 'datetime',
- message: 'Invalid ISO datetime',
- }),
- ])
- })
- })
- describe('datetimeNullable', () => {
- it('parses valid ISO 8601 datetime strings', () => {
- const parsed = zz.datetimeNullable().safeParse('2024-01-01T12:00:00Z')
- expect(parsed.success).toBe(true)
- expect(parsed.data).toEqual(new Date('2024-01-01T12:00:00Z'))
- })
- it('parses a valid ISO 8601 datetime with offset', () => {
- const parsed = zz
- .datetimeNullable({ offset: true })
- .safeParse('2024-01-01T12:00:00+00:00')
- expect(parsed.success).toBe(true)
- expect(parsed.data).toEqual(new Date('2024-01-01T12:00:00+00:00'))
- })
- it('parses a valid Date object', () => {
- const date = new Date('2024-01-01T12:00:00Z')
- const parsed = zz.datetimeNullable().safeParse(date)
- expect(parsed.success).toBe(true)
- expect(parsed.data).toEqual(date)
- })
- it('fails to parse datetime with offset when offset option is false', () => {
- const parsed = zz
- .datetimeNullable({ offset: false })
- .safeParse('2024-01-01T12:00:00+00:00')
- expect(parsed.success).toBe(false)
- expect(parsed.error?.issues).toHaveLength(1)
- expect(parsed.error?.issues).toMatchObject([
- expect.objectContaining({
- code: 'invalid_format',
- format: 'datetime',
- message: 'Invalid ISO datetime',
- }),
- ])
- })
- it('parses null when schema is nullable and input is null', () => {
- const parsed = zz.datetimeNullable().safeParse(null)
- expect(parsed.success).toBe(true)
- expect(parsed.data).toBeNull()
- })
- it('fails to parse invalid datetime strings', () => {
- const parsed = zz.datetimeNullable().safeParse('invalid-datetime')
- expect(parsed.success).toBe(false)
- expect(parsed.error?.issues).toHaveLength(1)
- expect(parsed.error?.issues).toMatchObject([
- expect.objectContaining({
- code: 'invalid_format',
- format: 'datetime',
- message: 'Invalid ISO datetime',
- }),
- ])
- })
- })
- describe('datetimeNullish', () => {
- it('parses valid ISO 8601 datetime strings', () => {
- const parsed = zz.datetimeNullish().safeParse('2024-01-01T12:00:00Z')
- expect(parsed.success).toBe(true)
- expect(parsed.data).toEqual(new Date('2024-01-01T12:00:00Z'))
- })
- it('parses a valid ISO 8601 datetime with offset', () => {
- const parsed = zz
- .datetimeNullish({ offset: true })
- .safeParse('2024-01-01T12:00:00+00:00')
- expect(parsed.success).toBe(true)
- expect(parsed.data).toEqual(new Date('2024-01-01T12:00:00+00:00'))
- })
- it('parses a valid Date object', () => {
- const date = new Date('2024-01-01T12:00:00Z')
- const parsed = zz.datetimeNullish().safeParse(date)
- expect(parsed.success).toBe(true)
- expect(parsed.data).toEqual(date)
- })
- it('parses null when schema is nullable and input is null', () => {
- const parsed = zz.datetimeNullish().safeParse(null)
- expect(parsed.success).toBe(true)
- expect(parsed.data).toBeNull()
- })
- it('parses undefined when schema is nullish and input is undefined', () => {
- const parsed = zz.datetimeNullish().safeParse(undefined)
- expect(parsed.success).toBe(true)
- expect(parsed.data).toBeUndefined()
- })
- it('fails to parse datetime with offset when offset option is false', () => {
- const parsed = zz
- .datetimeNullish({ offset: false })
- .safeParse('2024-01-01T12:00:00+00:00')
- expect(parsed.success).toBe(false)
- expect(parsed.error?.issues).toHaveLength(1)
- expect(parsed.error?.issues).toMatchObject([
- expect.objectContaining({
- code: 'invalid_format',
- format: 'datetime',
- message: 'Invalid ISO datetime',
- }),
- ])
- })
- it('fails to parse invalid datetime strings', () => {
- const parsed = zz.datetimeNullish().safeParse('invalid-datetime')
- expect(parsed.success).toBe(false)
- expect(parsed.error?.issues).toHaveLength(1)
- expect(parsed.error?.issues).toMatchObject([
- expect.objectContaining({
- code: 'invalid_format',
- format: 'datetime',
- message: 'Invalid ISO datetime',
- }),
- ])
- })
- })
- describe('buildId', () => {
- it('fails to parse when provided with an invalid buildId', () => {
- const parsed = zz.buildId().safeParse('aa')
- expect(parsed.success).toBe(false)
- expect(parsed.error?.issues).toHaveLength(1)
- expect(parsed.error?.issues).toMatchObject([
- expect.objectContaining({
- message: 'invalid buildId',
- }),
- ])
- })
- it('parses successfully when provided with a valid buildId', () => {
- const parsed = zz.buildId().safeParse('19d6c341530-878fff6cdab7fb0c')
- expect(parsed.success).toBe(true)
- expect(parsed.data).toBe('19d6c341530-878fff6cdab7fb0c')
- })
- it('fails to parse when provided with an editorBuildId', () => {
- const parsed = zz
- .buildId()
- .safeParse(
- '03b1d773-6203-4669-b365-6a0aa5625878-19d6c341530-878fff6cdab7fb0c'
- )
- expect(parsed.success).toBe(false)
- expect(parsed.error?.issues).toHaveLength(1)
- expect(parsed.error?.issues).toMatchObject([
- expect.objectContaining({
- message: 'invalid buildId',
- }),
- ])
- })
- })
- describe('editorBuildId', () => {
- it('fails to parse when provided with an invalid buildId', () => {
- const parsed = zz.editorBuildId().safeParse('aa')
- expect(parsed.success).toBe(false)
- expect(parsed.error?.issues).toHaveLength(1)
- expect(parsed.error?.issues).toMatchObject([
- expect.objectContaining({
- message: 'invalid editorId-buildId',
- }),
- ])
- })
- it('fails to parse when provided with a buildId', () => {
- const parsed = zz
- .editorBuildId()
- .safeParse('19d6c341530-878fff6cdab7fb0c')
- expect(parsed.success).toBe(false)
- expect(parsed.error?.issues).toHaveLength(1)
- expect(parsed.error?.issues).toMatchObject([
- expect.objectContaining({
- message: 'invalid editorId-buildId',
- }),
- ])
- })
- it('parses successfully when provided with a valid editorId-buildId', () => {
- const parsed = zz
- .editorBuildId()
- .safeParse(
- '03b1d773-6203-4669-b365-6a0aa5625878-19d6c341530-878fff6cdab7fb0c'
- )
- expect(parsed.success).toBe(true)
- expect(parsed.data).toBe(
- '03b1d773-6203-4669-b365-6a0aa5625878-19d6c341530-878fff6cdab7fb0c'
- )
- })
- })
- describe('filepath', () => {
- it('fails to parse with empty input', () => {
- const parsed = zz.filepath().safeParse('')
- expect(parsed.success).toBe(false)
- expect(parsed.error?.issues).toHaveLength(1)
- expect(parsed.error?.issues).toMatchObject([
- expect.objectContaining({
- message: 'path is empty',
- }),
- ])
- })
- it('fails to parse with absolute path', () => {
- const parsed = zz.filepath().safeParse('/output.pdf')
- expect(parsed.success).toBe(false)
- expect(parsed.error?.issues).toHaveLength(1)
- expect(parsed.error?.issues).toMatchObject([
- expect.objectContaining({
- message: 'path is absolute',
- }),
- ])
- })
- it('fails to parse when provided with path traversal', () => {
- const parsed = zz.filepath().safeParse('../output.pdf')
- expect(parsed.success).toBe(false)
- expect(parsed.error?.issues).toHaveLength(1)
- expect(parsed.error?.issues).toMatchObject([
- expect.objectContaining({
- message: 'path traversal detected',
- }),
- ])
- })
- it('parses successfully when provided a valid path', () => {
- const parsed = zz.filepath().safeParse('output.pdf')
- expect(parsed.success).toBe(true)
- expect(parsed.data).toBe('output.pdf')
- })
- it('parses successfully when provided a valid nested path', () => {
- const parsed = zz.filepath().safeParse('foo/output.pdf')
- expect(parsed.success).toBe(true)
- expect(parsed.data).toBe('foo/output.pdf')
- })
- })
- })
|