Best JavaScript code snippet using playwright-internal
index.test.js
Source: index.test.js
...45 }46}47const prefix = `PropTypes`48describe(`prop-validator package`, () => {49 describe(`validateProps()`, () => {50 it(`correctly validates basic types`, () => {51 const valid = [52 validateProps({53 a: PropTypes.string,54 b: PropTypes.number,55 c: PropTypes.integer,56 d: PropTypes.boolean,57 e: PropTypes.function,58 f: PropTypes.object,59 g: PropTypes.array,60 h: PropTypes.symbol,61 i: PropTypes.regex,62 j: PropTypes.any63 }, {64 a: 'hello',65 b: 123.123,66 c: 10,67 d: false,68 e: () => { console.log('hi'); },69 f: { a: 'b' },70 g: ['a', 'b', 'c'],71 h: Symbol('hello world'),72 i: /[0-9]+/g,73 j: 'whatever'74 }),75 validateProps({76 q: PropTypes.numberRange(-1.2, 5),77 w: PropTypes.integerRange(-1.2, 5),78 e: PropTypes.stringMatching(/a|b/),79 r: PropTypes.oneOf(['qwerty', 'azerty']),80 t: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),81 y: PropTypes.arrayOf(PropTypes.string),82 u: PropTypes.objectOf(PropTypes.number),83 i: PropTypes.instanceOf(TestClassA),84 o: PropTypes.customProp((value, key, object, state, parentInfo) => typeof value === 'string' || value === 5, 'Any string or number 5'),85 p: PropTypes.shape({86 a: PropTypes.string,87 b: PropTypes.number88 }),89 a: PropTypes.exact({90 a: PropTypes.string,91 b: PropTypes.number92 })93 }, {94 q: 2.2,95 w: 2,96 e: 'a',97 r: 'qwerty',98 t: 5,99 y: ['a', 'b', 'c'],100 u: { a: 4, b: 5 },101 i: new TestClassA(),102 o: 5,103 p: {104 a: 'a',105 b: 5,106 c: 'anything'107 },108 a: {109 a: 'a',110 b: 5111 }112 })113 ]114 const invalid = [115 validateProps({116 a: PropTypes.string,117 b: PropTypes.number,118 c: PropTypes.integer,119 d: PropTypes.boolean,120 e: PropTypes.function,121 f: PropTypes.object,122 g: PropTypes.array,123 h: PropTypes.symbol,124 i: PropTypes.regex,125 j: PropTypes.any.isRequired126 }, {127 a: 4,128 b: 'a',129 c: 23.34,130 d: [],131 e: {},132 f: () => true,133 g: Symbol('nah'),134 h: /[0-9]+/,135 i: new TestClassA(),136 j: undefined137 })138 ]139 for (const validItem of valid) {140 expect(validItem).toMatchObject(validTypeCheck())141 }142 for (const invalidItem of invalid) {143 expect(invalidItem).toMatchObject(invalidTypeCheck())144 }145 const invalidProps1 = validateProps({ a: PropTypes.string, b: PropTypes.number, c: PropTypes.integer }, { a: 'hello', b: 10, c: 10.50 })146 expect(invalidProps1).toMatchObject(invalidTypeCheck())147 expect(invalidProps1.errors).toHaveLength(1)148 expect(invalidProps1.results).toHaveLength(3)149 const invalidProps2 = validateProps({ a: PropTypes.string, b: PropTypes.number, c: PropTypes.integer.isRequired }, { a: 'hello', b: 10 })150 expect(invalidProps2).toMatchObject(invalidTypeCheck())151 expect(invalidProps2.errors).toHaveLength(1)152 expect(invalidProps2.results).toHaveLength(3)153 const validProps1 = validateProps({154 a: PropTypes.string,155 b: PropTypes.shape({156 a: PropTypes.string,157 b: PropTypes.shape({158 a: PropTypes.shape({159 a: PropTypes.number,160 b: PropTypes.string161 }),162 b: PropTypes.arrayOf(PropTypes.shape({163 a: PropTypes.string,164 b: PropTypes.number,165 c: PropTypes.stringMatching(/a|b/)166 }))167 })168 })169 }, {170 a: 'aaa',171 b: {172 a: 'aaa',173 b: {174 a: {175 a: 234,176 b: 'bbb'177 },178 b: [179 { a: 'aaa', b: 3, c: 'a' },180 { a: 'aa', b: 4, c: 'a' },181 { a: 'a', b: 5, c: 'b' },182 { a: 'aa', b: 76, c: 'a' },183 { a: 'aaa', b: 77, c: 'b' }184 ]185 }186 }187 })188 expect(validProps1).toMatchObject(validTypeCheck())189 expect(validProps1.results).toHaveLength(23)190 expect(validProps1.results[0].objectPath).toBe('a')191 expect(validProps1.results[1].objectPath).toBe('b')192 expect(validProps1.results[2].objectPath).toBe('b.a')193 expect(validProps1.results[3].objectPath).toBe('b.b')194 expect(validProps1.results[4].objectPath).toBe('b.b.a')195 expect(validProps1.results[5].objectPath).toBe('b.b.a.a')196 expect(validProps1.results[6].objectPath).toBe('b.b.a.b')197 expect(validProps1.results[7].objectPath).toBe('b.b.b')198 expect(validProps1.results[8].objectPath).toBe('b.b.b[0].a')199 expect(validProps1.results[9].objectPath).toBe('b.b.b[0].b')200 expect(validProps1.results[10].objectPath).toBe('b.b.b[0].c')201 expect(validProps1.results[11].objectPath).toBe('b.b.b[1].a')202 expect(validProps1.results[12].objectPath).toBe('b.b.b[1].b')203 expect(validProps1.results[13].objectPath).toBe('b.b.b[1].c')204 expect(validProps1.results[14].objectPath).toBe('b.b.b[2].a')205 expect(validProps1.results[15].objectPath).toBe('b.b.b[2].b')206 expect(validProps1.results[16].objectPath).toBe('b.b.b[2].c')207 expect(validProps1.results[17].objectPath).toBe('b.b.b[3].a')208 expect(validProps1.results[18].objectPath).toBe('b.b.b[3].b')209 expect(validProps1.results[19].objectPath).toBe('b.b.b[3].c')210 expect(validProps1.results[20].objectPath).toBe('b.b.b[4].a')211 expect(validProps1.results[21].objectPath).toBe('b.b.b[4].b')212 expect(validProps1.results[22].objectPath).toBe('b.b.b[4].c')213 })214 })215 describe(`PropTypes`, () => {216 it(`${prefix}.string`, () => {217 const valid1 = validateProps({ val: PropTypes.string }, { val: 'hello' })218 const valid2 = validateProps({ val: PropTypes.string }, { val: null })219 const valid3 = validateProps({ val: PropTypes.string.isRequired }, { val: 'hello' })220 const invalid1 = validateProps({ val: PropTypes.string }, { val: 5 })221 const invalid2 = validateProps({ val: PropTypes.string.isRequired }, { val: null })222 expect(valid1).toMatchObject(validTypeCheck())223 expect(valid2).toMatchObject(validTypeCheck())224 expect(valid1.results[0]).toMatchObject(validResult('val', ['string', 'null']))225 expect(valid2.results[0]).toMatchObject(validResult('val', ['string', 'null']))226 expect(valid3.results[0]).toMatchObject(validResult('val', ['string']))227 expect(invalid1).toMatchObject(invalidTypeCheck())228 expect(invalid2).toMatchObject(invalidTypeCheck())229 expect(invalid1.results[0]).toMatchObject(invalidResult('val', ['string', 'null'], { message: `Property 'val' should be type 'string | null', but type 'number' was found` }))230 expect(invalid2.results[0]).toMatchObject(invalidResult('val', ['string'], { message: `Property 'val' should be type 'string', but type 'null' was found` }))231 })232 it(`${prefix}.number`, () => {233 const valid1 = validateProps({ val: PropTypes.number }, { val: 5.5 })234 const valid2 = validateProps({ val: PropTypes.number }, { val: 6 })235 const valid3 = validateProps({ val: PropTypes.number }, { val: -5 })236 const valid4 = validateProps({ val: PropTypes.number.isRequired }, { val: -5 })237 238 const invalid1 = validateProps({ val: PropTypes.number }, { val: 'a' })239 const invalid2 = validateProps({ val: PropTypes.number }, { val: [] })240 const invalid3 = validateProps({ val: PropTypes.number }, { val: {} })241 const invalid4 = validateProps({ val: PropTypes.number.isRequired }, { val: null })242 expect(valid1).toMatchObject(validTypeCheck())243 expect(valid2).toMatchObject(validTypeCheck())244 expect(valid3).toMatchObject(validTypeCheck())245 expect(valid4).toMatchObject(validTypeCheck())246 expect(valid1.results[0]).toMatchObject(validResult('val', ['number', 'null']))247 expect(valid2.results[0]).toMatchObject(validResult('val', ['number', 'null']))248 expect(valid3.results[0]).toMatchObject(validResult('val', ['number', 'null']))249 expect(valid4.results[0]).toMatchObject(validResult('val', ['number']))250 expect(invalid1).toMatchObject(invalidTypeCheck())251 expect(invalid2).toMatchObject(invalidTypeCheck())252 expect(invalid3).toMatchObject(invalidTypeCheck())253 expect(invalid4).toMatchObject(invalidTypeCheck())254 expect(invalid1.results[0]).toMatchObject(invalidResult('val', ['number', 'null'], { message: `Property 'val' should be type 'number | null', but type 'string' was found` }))255 expect(invalid2.results[0]).toMatchObject(invalidResult('val', ['number', 'null'], { message: `Property 'val' should be type 'number | null', but type 'Array' was found` }))256 expect(invalid3.results[0]).toMatchObject(invalidResult('val', ['number', 'null'], { message: `Property 'val' should be type 'number | null', but type 'Object' was found` }))257 expect(invalid4.results[0]).toMatchObject(invalidResult('val', ['number'], { message: `Property 'val' should be type 'number', but type 'null' was found` }))258 })259 it(`${prefix}.integer`, () => {260 const valid1 = validateProps({ val: PropTypes.integer }, { val: 2 })261 const valid2 = validateProps({ val: PropTypes.integer }, { val: 6 })262 const valid3 = validateProps({ val: PropTypes.integer.isRequired }, { val: 6 })263 const invalid1 = validateProps({ val: PropTypes.integer }, { val: 2.5 })264 const invalid2 = validateProps({ val: PropTypes.integer }, { val: 'a' })265 const invalid3 = validateProps({ val: PropTypes.integer.isRequired }, { val: null })266 expect(valid1).toMatchObject(validTypeCheck())267 expect(valid2).toMatchObject(validTypeCheck())268 expect(valid3).toMatchObject(validTypeCheck())269 expect(valid1.results[0]).toMatchObject(validResult('val', ['number: integer', 'null']))270 expect(valid2.results[0]).toMatchObject(validResult('val', ['number: integer', 'null']))271 expect(valid3.results[0]).toMatchObject(validResult('val', ['number: integer']))272 expect(invalid1).toMatchObject(invalidTypeCheck())273 expect(invalid2).toMatchObject(invalidTypeCheck())274 expect(invalid3).toMatchObject(invalidTypeCheck())275 expect(invalid1.results[0]).toMatchObject(invalidResult('val', ['number: integer', 'null'], { message: `Property 'val' should be type 'number: integer | null'` }))276 expect(invalid2.results[0]).toMatchObject(invalidResult('val', ['number: integer', 'null'], { message: `Property 'val' should be type 'number: integer | null', but type 'string' was found` }))277 expect(invalid3.results[0]).toMatchObject(invalidResult('val', ['number: integer'], { message: `Property 'val' should be type 'number: integer', but type 'null' was found` }))278 })279 it(`${prefix}.boolean`, () => {280 const valid1 = validateProps({ val: PropTypes.boolean }, { val: true })281 const valid2 = validateProps({ val: PropTypes.boolean }, { val: false })282 const valid3 = validateProps({ val: PropTypes.bool }, { val: true })283 const valid4 = validateProps({ val: PropTypes.bool }, { val: false })284 const valid5 = validateProps({ val: PropTypes.bool }, { val: null })285 const valid6 = validateProps({ val: PropTypes.bool.isRequired }, { val: false })286 const invalid1 = validateProps({ val: PropTypes.boolean }, { val: 2.5 })287 const invalid2 = validateProps({ val: PropTypes.boolean }, { val: 'a' })288 const invalid3 = validateProps({ val: PropTypes.boolean.isRequired }, { val: null })289 const invalid4 = validateProps({ val: PropTypes.bool.isRequired }, { val: null })290 const invalid5 = validateProps({ val: PropTypes.bool.isRequired }, { val: undefined })291 expect(valid1).toMatchObject(validTypeCheck())292 expect(valid2).toMatchObject(validTypeCheck())293 expect(valid3).toMatchObject(valid1)294 expect(valid4).toMatchObject(valid2)295 expect(valid5).toMatchObject(validTypeCheck())296 expect(valid6).toMatchObject(validTypeCheck())297 expect(valid1.results[0]).toMatchObject(validResult('val', ['boolean', 'null']))298 expect(valid2.results[0]).toMatchObject(validResult('val', ['boolean', 'null']))299 expect(valid3.results[0]).toMatchObject(validResult('val', ['boolean', 'null']))300 expect(valid4.results[0]).toMatchObject(validResult('val', ['boolean', 'null']))301 expect(valid5.results[0]).toMatchObject(validResult('val', ['boolean', 'null']))302 expect(valid6.results[0]).toMatchObject(validResult('val', ['boolean']))303 expect(invalid1).toMatchObject(invalidTypeCheck())304 expect(invalid2).toMatchObject(invalidTypeCheck())305 expect(invalid3).toMatchObject(invalidTypeCheck())306 expect(invalid4).toMatchObject(invalidTypeCheck())307 expect(invalid5).toMatchObject(invalidTypeCheck())308 expect(invalid1.results[0]).toMatchObject(invalidResult('val', ['boolean', 'null'], { message: `Property 'val' should be type 'boolean | null', but type 'number' was found` }))309 expect(invalid2.results[0]).toMatchObject(invalidResult('val', ['boolean', 'null'], { message: `Property 'val' should be type 'boolean | null', but type 'string' was found` }))310 expect(invalid3.results[0]).toMatchObject(invalidResult('val', ['boolean'], { message: `Property 'val' should be type 'boolean', but type 'null' was found` }))311 expect(invalid4.results[0]).toMatchObject(invalidResult('val', ['boolean'], { message: `Property 'val' should be type 'boolean', but type 'null' was found` }))312 expect(invalid5.results[0]).toMatchObject(invalidResult('val', ['boolean'], { message: `Property 'val' should be type 'boolean', but type 'undefined' was found` }))313 })314 it(`${prefix}.function`, () => {315 const testFn = () => console.log('hi')316 const valid1 = validateProps({ val: PropTypes.function }, { val: testFn })317 const valid2 = validateProps({ val: PropTypes.function }, { val: function something() { console.log('hi'); } })318 const valid3 = validateProps({ val: PropTypes.function }, { val: function () { console.log('hi'); } })319 const valid4 = validateProps({ val: PropTypes.function }, { val: async () => { console.log('hi'); } })320 const valid5 = validateProps({ val: PropTypes.function }, { val: async function () { console.log('hi'); } })321 const valid6 = validateProps({ val: PropTypes.func }, { val: testFn })322 const valid7 = validateProps({ val: PropTypes.func.isRequired }, { val: testFn })323 const invalid1 = validateProps({ val: PropTypes.function }, { val: [] })324 const invalid2 = validateProps({ val: PropTypes.function }, { val: 'a' })325 const invalid3 = validateProps({ val: PropTypes.function.isRequired }, { val: null })326 expect(valid1).toMatchObject(validTypeCheck())327 expect(valid2).toMatchObject(validTypeCheck())328 expect(valid3).toMatchObject(validTypeCheck())329 expect(valid4).toMatchObject(validTypeCheck())330 expect(valid5).toMatchObject(validTypeCheck())331 expect(valid6).toMatchObject(valid1)332 expect(valid6).toMatchObject(validTypeCheck())333 expect(valid1.results[0]).toMatchObject(validResult('val', ['function', 'null']))334 expect(valid2.results[0]).toMatchObject(validResult('val', ['function', 'null']))335 expect(valid3.results[0]).toMatchObject(validResult('val', ['function', 'null']))336 expect(valid4.results[0]).toMatchObject(validResult('val', ['function', 'null']))337 expect(valid5.results[0]).toMatchObject(validResult('val', ['function', 'null']))338 expect(valid6.results[0]).toMatchObject(validResult('val', ['function', 'null']))339 expect(valid7.results[0]).toMatchObject(validResult('val', ['function']))340 341 expect(invalid1).toMatchObject(invalidTypeCheck())342 expect(invalid2).toMatchObject(invalidTypeCheck())343 expect(invalid3).toMatchObject(invalidTypeCheck())344 expect(invalid1.results[0]).toMatchObject(invalidResult('val', ['function', 'null'], { message: `Property 'val' should be type 'function | null', but type 'Array' was found` }))345 expect(invalid2.results[0]).toMatchObject(invalidResult('val', ['function', 'null'], { message: `Property 'val' should be type 'function | null', but type 'string' was found` }))346 expect(invalid3.results[0]).toMatchObject(invalidResult('val', ['function'], { message: `Property 'val' should be type 'function', but type 'null' was found` }))347 })348 it(`${prefix}.object`, () => {349 const valid1 = validateProps({ val: PropTypes.object }, { val: {} })350 const valid2 = validateProps({ val: PropTypes.object }, { val: { a: 'b' } })351 const valid3 = validateProps({ val: PropTypes.object.isRequired }, { val: new Object() })352 const invalid1 = validateProps({ val: PropTypes.object }, { val: [] })353 expect(valid1).toMatchObject(validTypeCheck())354 expect(valid2).toMatchObject(validTypeCheck())355 expect(valid3).toMatchObject(validTypeCheck())356 expect(valid1.results[0]).toMatchObject(validResult('val', ['Object<*>', 'null']))357 expect(valid2.results[0]).toMatchObject(validResult('val', ['Object<*>', 'null']))358 expect(valid3.results[0]).toMatchObject(validResult('val', ['Object<*>']))359 360 expect(invalid1).toMatchObject(invalidTypeCheck())361 expect(invalid1.results[0]).toMatchObject(invalidResult('val', ['Object<*>', 'null'], { message: `Property 'val' should be type 'Object<*> | null', but type 'Array' was found` }))362 })363 it(`${prefix}.array`, () => {364 const valid1 = validateProps({ val: PropTypes.array }, { val: ['a', 'b'] })365 const valid2 = validateProps({ val: PropTypes.array.isRequired }, { val: new Array() })366 const invalid1 = validateProps({ val: PropTypes.array }, { val: 5.5 })367 const invalid2 = validateProps({ val: PropTypes.array.isRequired }, { val: null })368 expect(valid1).toMatchObject(validTypeCheck())369 expect(valid2).toMatchObject(validTypeCheck())370 expect(valid1.results[0]).toMatchObject(validResult('val', ['Array<*>', 'null']))371 expect(valid2.results[0]).toMatchObject(validResult('val', ['Array<*>']))372 373 expect(invalid1).toMatchObject(invalidTypeCheck())374 expect(invalid2).toMatchObject(invalidTypeCheck())375 expect(invalid1.results[0]).toMatchObject(invalidResult('val', ['Array<*>', 'null'], { message: `Property 'val' should be type 'Array<*> | null', but type 'number' was found` }))376 expect(invalid2.results[0]).toMatchObject(invalidResult('val', ['Array<*>'], { message: `Property 'val' should be type 'Array<*>', but type 'null' was found` }))377 })378 it(`${prefix}.symbol`, () => {379 const valid1 = validateProps({ val: PropTypes.symbol.isRequired }, { val: Symbol('a') })380 const invalid1 = validateProps({ val: PropTypes.symbol.isRequired }, { val: 5.5 })381 expect(valid1).toMatchObject(validTypeCheck())382 expect(valid1.results[0]).toMatchObject(validResult('val', ['symbol']))383 384 expect(invalid1).toMatchObject(invalidTypeCheck())385 expect(invalid1.results[0]).toMatchObject(invalidResult('val', ['symbol'], { message: `Property 'val' should be type 'symbol', but type 'number' was found` }))386 })387 it(`${prefix}.regex`, () => {388 const valid1 = validateProps({ val: PropTypes.regex.isRequired }, { val: /a|b/ })389 const valid2 = validateProps({ val: PropTypes.regex.isRequired }, { val: /((.+?)[0-9]{2})/g })390 const valid3 = validateProps({ val: PropTypes.regex.isRequired }, { val: new RegExp('^([0-9]|b|c)+$', 'i') })391 const invalid1 = validateProps({ val: PropTypes.regex.isRequired }, { val: 5.5 })392 expect(valid1).toMatchObject(validTypeCheck())393 expect(valid1.results[0]).toMatchObject(validResult('val', ['RegExp']))394 expect(valid2).toMatchObject(validTypeCheck())395 expect(valid2.results[0]).toMatchObject(validResult('val', ['RegExp']))396 expect(valid3).toMatchObject(validTypeCheck())397 expect(valid3.results[0]).toMatchObject(validResult('val', ['RegExp']))398 399 expect(invalid1).toMatchObject(invalidTypeCheck())400 expect(invalid1.results[0]).toMatchObject(invalidResult('val', ['RegExp'], { message: `Property 'val' should be type 'RegExp', but type 'number' was found` }))401 })402 it(`${prefix}.error`, () => {403 class MyError extends Error {404 constructor(args) {405 super(args)406 this.code = 'hello world'407 }408 }409 const getError = fn => {410 try {411 return fn()412 }413 catch (err) {414 return err415 }416 }417 const valid = [418 validateProps({ val: PropTypes.error.isRequired }, { val: new Error('test') }),419 validateProps({ val: PropTypes.error.isRequired }, { val: new TypeError('test') }),420 validateProps({ val: PropTypes.error.isRequired }, { val: new ReferenceError('test') }),421 validateProps({ val: PropTypes.error.isRequired }, { val: new SyntaxError('test') }),422 validateProps({ val: PropTypes.error.isRequired }, { val: new TypeError('test') }),423 validateProps({ val: PropTypes.error.isRequired }, { val: new URIError('test') }),424 validateProps({ val: PropTypes.error.isRequired }, { val: new MyError('test') }),425 validateProps({ val: PropTypes.error.isRequired }, { val: getError(() => { a() }) })426 ]427 const invalid = [428 validateProps({ val: PropTypes.error.isRequired }, { val: 5.5 }),429 validateProps({ val: PropTypes.error.isRequired }, { val: getError(() => { 1 + 1; }) })430 ]431 for (const validItem of valid) {432 expect(validItem).toMatchObject(validTypeCheck())433 }434 for (const invalidItem of invalid) {435 expect(invalidItem).toMatchObject(invalidTypeCheck())436 }437 expect(invalid[0].results[0]).toMatchObject(invalidResult('val', ['Error'], { message: `Property 'val' should be type 'Error', but type 'number' was found` }))438 })439 it(`${prefix}.null`, () => {440 const valid = [441 validateProps({ val: PropTypes.null }, { val: null }),442 validateProps({ val: PropTypes.null.isRequired }, { val: null }),443 validateProps({ val: PropTypes.null }, { val: undefined })444 ]445 const invalid = [446 validateProps({ val: PropTypes.null }, { val: 1 }),447 validateProps({ val: PropTypes.null.isRequired }, { val: undefined }),448 validateProps({ val: PropTypes.null }, { val: 'b' })449 ]450 for (const validItem of valid) {451 expect(validItem).toMatchObject(validTypeCheck())452 }453 for (const invalidItem of invalid) {454 expect(invalidItem).toMatchObject(invalidTypeCheck())455 }456 expect(invalid[0].results[0]).toMatchObject(invalidResult('val', ['null'], { message: `Property 'val' should be type 'null', but type 'number' was found` }))457 })458 it(`${prefix}.undefined`, () => {459 const valid = [460 validateProps({ val: PropTypes.undefined }, { val: undefined }),461 validateProps({ val: PropTypes.undefined.isRequired }, { val: undefined })462 ]463 const invalid = [464 validateProps({ val: PropTypes.undefined }, { val: 1 }),465 validateProps({ val: PropTypes.undefined }, { val: null }),466 validateProps({ val: PropTypes.undefined.isRequired }, { val: null }),467 validateProps({ val: PropTypes.undefined }, { val: 'b' })468 ]469 for (const validItem of valid) {470 expect(validItem).toMatchObject(validTypeCheck())471 }472 for (const invalidItem of invalid) {473 expect(invalidItem).toMatchObject(invalidTypeCheck())474 }475 expect(invalid[0].results[0]).toMatchObject(invalidResult('val', ['undefined'], { message: `Property 'val' should be type 'undefined', but type 'number' was found` }))476 })477 it(`${prefix}.any`, () => {478 const valid = [479 validateProps({ val: PropTypes.any }, { val: 'a' }),480 validateProps({ val: PropTypes.any }, { val: 2 }),481 validateProps({ val: PropTypes.any }, { val: [] }),482 validateProps({ val: PropTypes.any }, { val: {} }),483 validateProps({ val: PropTypes.any }, { val: Symbol('a') }),484 validateProps({ val: PropTypes.any }, { val: /[a-z]/ }),485 validateProps({ val: PropTypes.any }, { val: () => { console.log('a'); } }),486 validateProps({ val: PropTypes.any }, { val: null }),487 validateProps({ val: PropTypes.any }, { val: undefined }),488 validateProps({ val: PropTypes.any.isRequired }, { val: null })489 ]490 const invalid1 = validateProps({ val: PropTypes.any.isRequired }, { val: undefined })491 for (const validItem of valid) {492 expect(validItem).toMatchObject(validTypeCheck())493 expect(validItem.results[0]).toMatchObject(validResult('val', ['*']))494 }495 496 expect(invalid1).toMatchObject(invalidTypeCheck())497 expect(invalid1.results[0]).toMatchObject(invalidResult('val', ['*'], { message: `Property 'val' should be type '*', but type 'undefined' was found` }))498 })499 it(`${prefix}.numberRange`, () => {500 const valid = [501 validateProps({ val: PropTypes.numberRange(0, 5) }, { val: 3.5 }),502 validateProps({ val: PropTypes.numberRange.inclusive(0, 5) }, { val: 3.5 }),503 validateProps({ val: PropTypes.numberRange.inclusive(0, 5) }, { val: 5 }),504 validateProps({ val: PropTypes.numberRange.exclusive(0, 5) }, { val: 4.5 }),505 validateProps({ val: PropTypes.numberRange.greaterThan(0) }, { val: 2.5 }),506 validateProps({ val: PropTypes.numberRange.greaterThanOrEqual(0) }, { val: 0 }),507 validateProps({ val: PropTypes.numberRange.lessThan(0) }, { val: -4.5 }),508 validateProps({ val: PropTypes.numberRange.lessThanOrEqual(0) }, { val: 0 })509 ]510 const invalid = [511 validateProps({ val: PropTypes.numberRange(0, 5) }, { val: -5 }),512 validateProps({ val: PropTypes.numberRange.inclusive(0, 5) }, { val: -5 }),513 validateProps({ val: PropTypes.numberRange.exclusive(0, 5) }, { val: 9 }),514 validateProps({ val: PropTypes.numberRange.exclusive(0, 5) }, { val: 5 }),515 validateProps({ val: PropTypes.numberRange.greaterThan(0) }, { val: -2.5 }),516 validateProps({ val: PropTypes.numberRange.greaterThan(0) }, { val: 0 }),517 validateProps({ val: PropTypes.numberRange.greaterThanOrEqual(0) }, { val: -5 }),518 validateProps({ val: PropTypes.numberRange.lessThan(0) }, { val: 4.5 }),519 validateProps({ val: PropTypes.numberRange.lessThan(0) }, { val: 0 }),520 validateProps({ val: PropTypes.numberRange.lessThanOrEqual(0) }, { val: 2 })521 ]522 for (const validItem of valid) {523 expect(validItem).toMatchObject(validTypeCheck())524 }525 for (const invalidItem of invalid) {526 expect(invalidItem).toMatchObject(invalidTypeCheck())527 }528 expect(() => validateProps({ val: PropTypes.numberRange() }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)529 expect(() => validateProps({ val: PropTypes.numberRange(0) }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)530 expect(() => validateProps({ val: PropTypes.numberRange(1, 2, 3) }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)531 expect(() => validateProps({ val: PropTypes.numberRange.inclusive() }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)532 expect(() => validateProps({ val: PropTypes.numberRange.inclusive(0) }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)533 expect(() => validateProps({ val: PropTypes.numberRange.inclusive(0, 1, 2) }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)534 expect(() => validateProps({ val: PropTypes.numberRange.exclusive() }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)535 expect(() => validateProps({ val: PropTypes.numberRange.exclusive(0) }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)536 expect(() => validateProps({ val: PropTypes.numberRange.exclusive(0, 1, 2) }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)537 expect(() => validateProps({ val: PropTypes.numberRange.greaterThan() }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)538 expect(() => validateProps({ val: PropTypes.numberRange.greaterThan(0, 1) }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)539 expect(() => validateProps({ val: PropTypes.numberRange.greaterThan(0, 1, 2, 3) }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)540 expect(() => validateProps({ val: PropTypes.numberRange.greaterThanOrEqual() }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)541 expect(() => validateProps({ val: PropTypes.numberRange.greaterThanOrEqual(0, 1) }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)542 expect(() => validateProps({ val: PropTypes.numberRange.greaterThanOrEqual(0, 1, 2, 3) }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)543 expect(() => validateProps({ val: PropTypes.numberRange.lessThan() }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)544 expect(() => validateProps({ val: PropTypes.numberRange.lessThan(0, 1) }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)545 expect(() => validateProps({ val: PropTypes.numberRange.lessThan(0, 1, 2, 3) }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)546 expect(() => validateProps({ val: PropTypes.numberRange.lessThanOrEqual() }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)547 expect(() => validateProps({ val: PropTypes.numberRange.lessThanOrEqual(0, 1) }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)548 expect(() => validateProps({ val: PropTypes.numberRange.lessThanOrEqual(0, 1, 2, 3) }, { val: 3.5 })).toThrow(PropTypesValidatorErrorBase)549 })550 it(`${prefix}.integerRange`, () => {551 const valid = [552 validateProps({ val: PropTypes.integerRange(0, 5) }, { val: 3 }),553 validateProps({ val: PropTypes.integerRange.inclusive(0, 5) }, { val: 3 }),554 validateProps({ val: PropTypes.integerRange.inclusive(0, 5) }, { val: 5 }),555 validateProps({ val: PropTypes.integerRange.exclusive(0, 5) }, { val: 4 }),556 validateProps({ val: PropTypes.integerRange.greaterThan(0) }, { val: 2 }),557 validateProps({ val: PropTypes.integerRange.greaterThanOrEqual(0) }, { val: 0 }),558 validateProps({ val: PropTypes.integerRange.lessThan(0) }, { val: -4 }),559 validateProps({ val: PropTypes.integerRange.lessThanOrEqual(0) }, { val: 0 })560 ]561 const validRangeButNonIntegers = [562 validateProps({ val: PropTypes.integerRange(0, 5) }, { val: 3.5 }),563 validateProps({ val: PropTypes.integerRange.inclusive(0, 5) }, { val: 3.5 }),564 validateProps({ val: PropTypes.integerRange.inclusive(0, 5) }, { val: 4.5 }),565 validateProps({ val: PropTypes.integerRange.exclusive(0, 5) }, { val: 4.5 }),566 validateProps({ val: PropTypes.integerRange.greaterThan(0) }, { val: 2.5 }),567 validateProps({ val: PropTypes.integerRange.greaterThanOrEqual(0) }, { val: 0.5 }),568 validateProps({ val: PropTypes.integerRange.lessThan(0) }, { val: -4.5 }),569 validateProps({ val: PropTypes.integerRange.lessThanOrEqual(0) }, { val: -0.5 })570 ]571 const invalid = [572 validateProps({ val: PropTypes.integerRange(0, 5) }, { val: -5 }),573 validateProps({ val: PropTypes.integerRange.inclusive(0, 5) }, { val: -5 }),574 validateProps({ val: PropTypes.integerRange.exclusive(0, 5) }, { val: 9 }),575 validateProps({ val: PropTypes.integerRange.exclusive(0, 5) }, { val: 5 }),576 validateProps({ val: PropTypes.integerRange.greaterThan(0) }, { val: -2 }),577 validateProps({ val: PropTypes.integerRange.greaterThan(0) }, { val: 0 }),578 validateProps({ val: PropTypes.integerRange.greaterThanOrEqual(0) }, { val: -5 }),579 validateProps({ val: PropTypes.integerRange.lessThan(0) }, { val: 4 }),580 validateProps({ val: PropTypes.integerRange.lessThan(0) }, { val: 0 }),581 validateProps({ val: PropTypes.integerRange.lessThanOrEqual(0) }, { val: 2 })582 ]583 for (const validItem of valid) {584 expect(validItem).toMatchObject(validTypeCheck())585 }586 for (const invalidItem of [...invalid, ...validRangeButNonIntegers]) {587 expect(invalidItem).toMatchObject(invalidTypeCheck())588 }589 expect(() => validateProps({ val: PropTypes.integerRange(0) }, { val: 3 })).toThrow(PropTypesValidatorErrorBase)590 expect(() => validateProps({ val: PropTypes.integerRange.inclusive(0) }, { val: 3 })).toThrow(PropTypesValidatorErrorBase)591 expect(() => validateProps({ val: PropTypes.integerRange.exclusive(0) }, { val: 3 })).toThrow(PropTypesValidatorErrorBase)592 expect(() => validateProps({ val: PropTypes.integerRange.greaterThan(0, 1) }, { val: 3 })).toThrow(PropTypesValidatorErrorBase)593 expect(() => validateProps({ val: PropTypes.integerRange.greaterThanOrEqual(0, 1) }, { val: 3 })).toThrow(PropTypesValidatorErrorBase)594 expect(() => validateProps({ val: PropTypes.integerRange.lessThan(0, 1) }, { val: 3 })).toThrow(PropTypesValidatorErrorBase)595 expect(() => validateProps({ val: PropTypes.integerRange.lessThanOrEqual(0, 1) }, { val: 3 })).toThrow(PropTypesValidatorErrorBase)596 })597 it(`${prefix}.stringMatching`, () => {598 const valid = [599 validateProps({ val: PropTypes.stringMatching(/a|b/) }, { val: 'a' }),600 validateProps({ val: PropTypes.stringMatching(/a|b/) }, { val: 'b' }),601 validateProps({ val: PropTypes.stringMatching(/a|b/g) }, { val: 'b' }),602 validateProps({ val: PropTypes.stringMatching(/a|b/) }, { val: 'abc' }),603 validateProps({ val: PropTypes.stringMatching(/a|b/) }, { val: 'cbbc' }),604 validateProps({ val: PropTypes.stringMatching(/a|b/g) }, { val: 'cbbc' }),605 validateProps({ val: PropTypes.stringMatching(/^a$/) }, { val: 'a' }),606 validateProps({ val: PropTypes.stringMatching(/^a$/g) }, { val: 'a' })607 ]608 const invalid = [609 validateProps({ val: PropTypes.stringMatching(/a|b/) }, { val: 'x' }),610 validateProps({ val: PropTypes.stringMatching(/a|b/g) }, { val: 'x' }),611 validateProps({ val: PropTypes.stringMatching(/^a$/) }, { val: ' a ' }),612 validateProps({ val: PropTypes.stringMatching(/^a$/g) }, { val: ' a ' }),613 validateProps({ val: PropTypes.stringMatching(/^a$/g) }, { val: 2 }),614 validateProps({ val: PropTypes.stringMatching(/^a$/g).isRequired }, { val: null })615 ]616 for (const validItem of valid) {617 expect(validItem).toMatchObject(validTypeCheck())618 }619 for (const invalidItem of invalid) {620 expect(invalidItem).toMatchObject(invalidTypeCheck())621 }622 expect(() => validateProps({ val: PropTypes.stringMatching(2) }, { val: 'a' })).toThrow(PropTypesValidatorErrorBase)623 })624 it(`${prefix}.oneOf`, () => {625 const valid = [626 validateProps({ val: PropTypes.oneOf(['a', 'b']) }, { val: 'a' }),627 validateProps({ val: PropTypes.oneOf(['a', 'b']) }, { val: 'b' }),628 validateProps({ val: PropTypes.oneOf(['a', 'b']) }, { val: 'b' }),629 validateProps({ val: PropTypes.oneOf(['a', 4]) }, { val: 4 })630 ]631 const invalid = [632 validateProps({ val: PropTypes.oneOf(['a', 'b']) }, { val: 'c' }),633 validateProps({ val: PropTypes.oneOf(['a', 'b']) }, { val: [] }),634 validateProps({ val: PropTypes.oneOf([PropTypes.string, PropTypes.number]) }, { val: 5 })635 ]636 for (const validItem of valid) {637 expect(validItem).toMatchObject(validTypeCheck())638 }639 for (const invalidItem of invalid) {640 expect(invalidItem).toMatchObject(invalidTypeCheck())641 }642 expect(() => validateProps({ val: PropTypes.oneOf('a') }, { val: 'b' })).toThrow(PropTypesValidatorErrorBase)643 expect(() => validateProps({ val: PropTypes.oneOf(['a', 'b']) }, { val: 'b' })).not.toThrow(PropTypesValidatorErrorBase)644 })645 it(`${prefix}.oneOfType`, () => {646 const valid = [647 validateProps({ val: PropTypes.oneOfType([PropTypes.string, PropTypes.number]) }, { val: 'a' }),648 validateProps({ val: PropTypes.oneOfType([PropTypes.string, PropTypes.number]) }, { val: 5 }),649 validateProps({ val: PropTypes.oneOfType([PropTypes.string, PropTypes.array]) }, { val: [] }),650 validateProps({ val: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)]) }, { val: ['a'] }),651 validateProps({ val: PropTypes.oneOfType([PropTypes.string, PropTypes.objectOf(PropTypes.arrayOf(PropTypes.string))]) }, { val: { a: ['a'] } })652 ]653 const invalid = [654 validateProps({ val: PropTypes.oneOfType([PropTypes.string, PropTypes.number]) }, { val: /a|b/ }),655 validateProps({ val: PropTypes.oneOfType([PropTypes.string, PropTypes.number]) }, { val: [] }),656 validateProps({ val: PropTypes.oneOfType([PropTypes.string, PropTypes.array]) }, { val: {} }),657 validateProps({ val: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)]) }, { val: [5] })658 ]659 for (const validItem of valid) {660 expect(validItem).toMatchObject(validTypeCheck())661 }662 for (const invalidItem of invalid) {663 expect(invalidItem).toMatchObject(invalidTypeCheck())664 }665 expect(() => validateProps({ val: PropTypes.oneOfType('a') }, { val: 'b' })).toThrow(PropTypesValidatorErrorBase)666 expect(() => validateProps({ val: PropTypes.oneOfType(['a', 'b']) }, { val: 'b' })).not.toThrow(PropTypesValidatorErrorBase)667 })668 it(`${prefix}.arrayOf`, () => {669 const valid = [670 validateProps({ val: PropTypes.arrayOf(PropTypes.string) }, { val: ['a', 'b'] }),671 validateProps({ val: PropTypes.arrayOf(PropTypes.number) }, { val: [5, 6] }),672 validateProps({ val: PropTypes.arrayOf(PropTypes.shape({ a: PropTypes.string, b: PropTypes.number })) }, { val: [{ a: 'a', b: 2 }, { a: 'aaa', b: 222 }] }),673 validateProps({ val: PropTypes.arrayOf(PropTypes.oneOf(['a', 'b'])) }, { val: ['a', 'a', 'a', 'b', 'b'] }),674 validateProps({ val: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.number)])) }, { val: ['a', 'b', [1, 2, 3], 'c', 'd'] })675 ]676 const invalid = [677 validateProps({ val: PropTypes.arrayOf(PropTypes.string) }, { val: [1] }),678 validateProps({ val: PropTypes.arrayOf(PropTypes.number) }, { val: ['5'] }),679 //validateProps({ val: PropTypes.arrayOf(PropTypes.shape({ a: PropTypes.string, b: PropTypes.number })) }, { val: [{ a: 4, b: 'a' }, { a: 3, b: 'a' }] }),680 validateProps({ val: PropTypes.arrayOf(PropTypes.oneOf(['a', 'b'])) }, { val: ['a', 'a', 'a', 'b', 'c'] }),681 validateProps({ val: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.number)])) }, { val: [5, 'b', ['a', 2, 3], 'c', 'd'] })682 ]683 for (const validItem of valid) {684 expect(validItem).toMatchObject(validTypeCheck())685 }686 for (const invalidItem of invalid) {687 expect(invalidItem).toMatchObject(invalidTypeCheck())688 }689 expect(() => validateProps({ val: PropTypes.arrayOf() }, { val: 'b' })).toThrow(PropTypesValidatorErrorBase)690 })691 it(`${prefix}.objectOf`, () => {692 const valid = [693 validateProps({ val: PropTypes.objectOf(PropTypes.string) }, { val: { x: 'a', y: 'b' } }),694 validateProps({ val: PropTypes.objectOf(PropTypes.number) }, { val: { a: 1, b: 2 } }),695 validateProps({ val: PropTypes.objectOf(PropTypes.shape({ a: PropTypes.string, b: PropTypes.number })) }, { val: { a: { a: 'a', b: 5 } } }),696 validateProps({ val: PropTypes.objectOf(PropTypes.oneOf(['a', 'b'])) }, { val: { a: 'a', b: 'b', c: 'b', d: 'b', e: 'a', f: 'a' } }),697 validateProps({ val: PropTypes.objectOf(PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.number)])) }, { val: { a: 'a', b: 'b', c: 'c', d: [1, 2, 3], e: 'a' } })698 ]699 const invalid = [700 validateProps({ val: PropTypes.objectOf(PropTypes.string) }, { val: { a: 4 } }),701 validateProps({ val: PropTypes.objectOf(PropTypes.number) }, { val: { a: 'a' } }),702 //validateProps({ val: PropTypes.objectOf(PropTypes.shape({ a: PropTypes.string, b: PropTypes.number })) }, { val: { a: { a: 'a', b: 'b' } } }),703 validateProps({ val: PropTypes.objectOf(PropTypes.oneOf(['a', 'b'])) }, { val: { a: 'a', b: 'b', c: 'c' } }),704 validateProps({ val: PropTypes.objectOf(PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.number)])) }, { val: { a: 'a', b: [3, 4, 'a'], c: 3 } })705 ]706 for (const validItem of valid) {707 expect(validItem).toMatchObject(validTypeCheck())708 }709 for (const invalidItem of invalid) {710 expect(invalidItem).toMatchObject(invalidTypeCheck())711 }712 expect(() => validateProps({ val: PropTypes.arrayOf() }, { val: 'b' })).toThrow(PropTypesValidatorErrorBase)713 })714 it(`${prefix}.instanceOf`, () => {715 const valid = [716 validateProps({ val: PropTypes.instanceOf(TestClassA) }, { val: new TestClassA() }),717 validateProps({ val: PropTypes.instanceOf(TestClassBase) }, { val: new TestClassBase() }),718 validateProps({ val: PropTypes.instanceOf(TestClassBase) }, { val: new TestClassA() })719 ]720 const invalid = [721 validateProps({ val: PropTypes.instanceOf(TestClassA) }, { val: 'a' }),722 validateProps({ val: PropTypes.instanceOf(TestClassBase) }, { val: 'b' }),723 validateProps({ val: PropTypes.instanceOf(TestClassBase) }, { val: 'c' })724 ]725 for (const validItem of valid) {726 expect(validItem).toMatchObject(validTypeCheck())727 }728 for (const invalidItem of invalid) {729 expect(invalidItem).toMatchObject(invalidTypeCheck())730 }731 function testFunction() {732 return true733 }734 expect(() => validateProps({ val: PropTypes.instanceOf('a') }, { val: 'b' })).toThrow(PropTypesValidatorErrorBase)735 expect(() => validateProps({ val: PropTypes.instanceOf(() => {}) }, { val: 'b' })).toThrow(PropTypesValidatorErrorBase)736 expect(() => validateProps({ val: PropTypes.instanceOf(new testFunction()) }, { val: 'b' })).toThrow(PropTypesValidatorErrorBase)737 })738 it(`${prefix}.shape`, () => {739 const valid = [740 validateProps({ val: PropTypes.shape({ a: PropTypes.string }) }, { val: { a: 'a' } }),741 validateProps({ val: PropTypes.shape({ a: PropTypes.string }) }, { val: { a: 'a', b: [] } }),742 validateProps({ val: PropTypes.shape({ a: PropTypes.string, b: PropTypes.string }) }, { val: { a: 'a', b: null } }),743 validateProps({ val: PropTypes.shape({ a: PropTypes.string, b: PropTypes.number }) }, { val: { a: 'a', b: 3 } }),744 validateProps({ val: PropTypes.shape({ a: PropTypes.string, b: PropTypes.shape({ a: PropTypes.array }) }) }, { val: { a: 'a', b: { a: [] } } }),745 validateProps({ val: PropTypes.shape({ a: PropTypes.string, b: PropTypes.shape({ a: PropTypes.instanceOf(TestClassBase)}) }) }, { val: { a: 'a', b: { a: new TestClassBase() } } })746 ]747 const invalid = [748 validateProps({ val: PropTypes.shape({ a: PropTypes.string }) }, { val: { a: 4 } }),749 validateProps({ val: PropTypes.shape({ a: PropTypes.number }) }, { val: { a: 'a' } }),750 validateProps({ val: PropTypes.shape({ a: PropTypes.number.isRequired }) }, { val: { a: null } })751 ]752 for (const validItem of valid) {753 expect(validItem).toMatchObject(validTypeCheck())754 }755 for (const invalidItem of invalid) {756 expect(invalidItem).toMatchObject(invalidTypeCheck())757 }758 expect(() => validateProps({ val: PropTypes.shape(PropTypes.number) }, { val: 45 })).toThrow(PropTypesValidatorErrorBase)759 expect(() => validateProps({ val: PropTypes.shape(PropTypes.string) }, { val: 'b' })).toThrow(PropTypesValidatorErrorBase)760 expect(() => validateProps({ val: PropTypes.shape([PropTypes.string]) }, { val: ['a'] })).toThrow(PropTypesValidatorErrorBase)761 })762 it(`${prefix}.customProp`, () => {763 const valid = [764 validateProps({ val: PropTypes.customProp(() => true, 'anything') }, { val: 'anything' }),765 validateProps({ val: PropTypes.customProp(value => value === 'anything' || value > 5, 'anything') }, { val: 8 }),766 validateProps({ val: PropTypes.customProp(value => value === 'anything' || value > 5, 'anything') }, { val: 'anything' }),767 validateProps({ val: PropTypes.customProp((value, key) => key === 'val' && true, 'anything') }, { val: 'anything' })768 ]769 const invalid = [770 validateProps({ val: PropTypes.customProp(() => false, 'nothing') }, { val: 'anything' }),771 validateProps({ val: PropTypes.customProp(value => value > 5, 'something') }, { val: 4 })772 ]773 for (const validItem of valid) {774 expect(validItem).toMatchObject(validTypeCheck())775 }776 for (const invalidItem of invalid) {777 expect(invalidItem).toMatchObject(invalidTypeCheck())778 }779 expect(() => validateProps({ val: PropTypes.customProp(5) }, { val: 45 })).toThrow(PropTypesValidatorErrorBase)780 expect(() => validateProps({ val: PropTypes.customProp(() => true, 5) }, { val: 45 })).toThrow(PropTypesValidatorErrorBase)781 expect(() => validateProps({ val: PropTypes.customProp(() => true, '') }, { val: 45 })).toThrow(PropTypesValidatorErrorBase)782 })783 })...
webhooks.spec.js
Source: webhooks.spec.js
...24 httpMock.restore();25 });26 describe('#validateProps', () => {27 it('should throw an error if props are not provided', () => {28 expect(() => api.validateProps()).to.throw(Error, noPropsMessage);29 });30 it('should throw an error if props are empty', () => {31 expect(() => api.validateProps({})).to.throw(Error, noPropsMessage);32 });33 it('should throw an error if target is not provided and required', () => {34 expect(() => api.validateProps({35 event: 'message'36 }, true)).to.throw(Error, noTargetMessage);37 });38 it('should not throw an error if target is provided and required', () => {39 expect(() => api.validateProps({40 target: webhookUrl,41 event: 'message'42 }, true)).to.not.throw;43 });44 it('should throw an error if props url target is malformed', () => {45 expect(() => api.validateProps({46 target: malformedWebhookUrl,47 event: 'message'48 })).to.throw(Error, malformedTargetUrl);49 });50 it('should not throw an error if props are provided and target is not required', () => {51 expect(() => api.validateProps({52 event: 'message'53 })).to.not.throw;54 });55 });56 describe('#list', () => {57 it('should call http', () => {58 return api.list().then(() => {59 const fullUrl = `${serviceUrl}/webhooks`;60 httpSpy.should.have.been.calledWith('GET', fullUrl, undefined, httpHeaders);61 });62 });63 it('should return an error if app token in auth', (done) => {64 const badApi = new WebhooksApi(serviceUrl, getAuthenticationHeaders({65 appToken: 'some-token'...
existsSchemaUpdate.js
Source: existsSchemaUpdate.js
1/* global MESSAGE,_ */2const {3 SERVER_ERROR, MODELS_UPDATED,4} = require('../../constants/message').message;5const { validateProperties } = require('./util');6const { existingSchemaUpdateValidation } = require('../util/validation/schema');7const {8 VALIDATION_MESSAGES, DEFAULT_FIELDS, DEFAULT_TABLE_NAME, DATA_TYPES,9} = require('../../constants/schema');10const {11 getDefaultFieldsForMongoDB, reOrderSchemaJson,12} = require('./util/staticData');13const { PROPS } = require('../../constants/dataTypes/props');14/**15 *16 * Function used for validate request.17 * @description :: Find Documentation @ http://validatejs.org/18 * @return mixed :: If error occurred then return array of errors else return undefined | null19 */20/*21 * async function validateData(data) {22 * const constraints = {23 */24/*25 * applicationId: {26 * presence: true,27 * type: 'string',28 * },29 * models: {30 * presence: true,31 * type: 'array',32 * },33 * };34 */35// const errors = validate(data, constraints);36/*37 * if (errors) {38 * return errors;39 * }40 */41/*42 * return null;43 * }44 */45const existsSchemaUpdate = (schemaRepo) => async (params) => {46 try {47 const {48 value, error,49 } = existingSchemaUpdateValidation(params);50 if (error) {51 return {52 data: null,53 code: MESSAGE.BAD_REQUEST.code,54 message: error,55 };56 }57 params = value;58 let modelErrors = [];59 const success = [];60 await Promise.all(params.models.map(async (model) => {61 if (model.isUploadedFile === true) {62 const schemaFilter = {63 find: {64 applicationId: params.applicationId,65 _id: model.schemaId,66 },67 };68 const schema = await schemaRepo.get(schemaFilter);69 if (!schema) {70 modelErrors.push({71 modelName: model.modelName,72 error: VALIDATION_MESSAGES.MODEL_NOT_FOUND,73 });74 } else {75 const validateProps = await validateProperties([76 {77 modelName: model.modelName,78 schemaJson: model.schemaJson,79 },80 ]);81 if (validateProps && (validateProps.errors && _.size(validateProps.errors) > 0)) {82 modelErrors.push(validateProps.errors);83 }84 if (validateProps?.originJson && _.size(validateProps.originJson) > 0) {85 model.schemaJson = _.cloneDeep(validateProps.originJson[0].schemaJson);86 }87 Object.keys(model.schemaJson).forEach((key) => {88 if (model.schemaJson[key].type && model.schemaJson[key].description && model.schemaJson[key].type.toUpperCase() === 'JSON') {89 model.schemaJson[key] = _.cloneDeep(model.schemaJson[key].description);90 } else if (model.schemaJson[key].type && model.schemaJson[key].description && _.isArray(model.schemaJson[key].description) && model.schemaJson[key].type.toUpperCase() === 'ARRAY') {91 model.schemaJson[key] = [_.cloneDeep(model.schemaJson[key].description[0])];92 }93 });94 const lowerSchemaJsonKeys = Object.keys(model.schemaJson).map((key) => key.toLowerCase());95 const defaultFields = await getDefaultFieldsForMongoDB();96 Object.keys(defaultFields).forEach((field) => {97 if (!_.includes(lowerSchemaJsonKeys, field.toLowerCase())) {98 model.schemaJson[field] = defaultFields[field];99 }100 });101 _.map(Object.keys(model.schemaJson), (key) => {102 if ((key.toLowerCase() === DEFAULT_FIELDS.ADDED_BY || key.toLowerCase() === DEFAULT_FIELDS.UPDATED_BY)) {103 if (typeof model.schemaJson[key] === 'string' && model.schemaJson[key].toLowerCase() === DATA_TYPES.OBJECTID.value.toLowerCase()) {104 model.schemaJson[key] = { type: model.schemaJson[key] };105 model.schemaJson[key][PROPS.REF] = DEFAULT_TABLE_NAME;106 } else if (model?.schemaJson[key]?.type && model?.schemaJson[key]?.type.toLowerCase() === DATA_TYPES.OBJECTID.value.toLowerCase()) {107 if (!model.schemaJson[key][PROPS.REF]) {108 model.schemaJson[key][PROPS.REF] = DEFAULT_TABLE_NAME;109 }110 }111 }112 });113 const updateModelInput = { schemaJson: model.schemaJson };114 if (updateModelInput?.schemaJson && !_.isEmpty(updateModelInput.schemaJson)) {115 updateModelInput.schemaJson = await reOrderSchemaJson(_.cloneDeep(updateModelInput.schemaJson));116 }117 const schemaUpdate = await schemaRepo.update(model.schemaId, updateModelInput);118 if (schemaUpdate) {119 success.push(schemaUpdate.toObject());120 } else {121 modelErrors.push({122 modelName: model.modelName,123 error: VALIDATION_MESSAGES.UPDATE_MODEL_ERROR,124 });125 }126 }127 }128 }));129 modelErrors = _.cloneDeep(_.flattenDeep(_.uniq(modelErrors)));130 return {131 ...MODELS_UPDATED,132 data: {133 error: modelErrors,134 success,135 },136 };137 } catch (err) {138 // eslint-disable-next-line no-console139 // console.log('error', err);140 return { ...SERVER_ERROR };141 // return { ...SERVER_ERROR, data: err.toString() };142 }143};...
props.test.js
Source: props.test.js
...82});83describe('validateProps', () => {84 it('recognizes an unknown prop', () => {85 const prop = '__x';86 validateProps({[prop]: true});87 expect(console.warn).toHaveBeenCalledWith(88 ...getFormattedMessage(89 [90 `\`${prop}\``,91 "is not a valid prop. You may have spelled it incorrectly, or if it's",92 'a plugin, forgot to pass it in an array as props.plugins.',93 '\n\n',94 'All props: https://atomiks.github.io/tippyjs/v6/all-props/\n',95 'Plugins: https://atomiks.github.io/tippyjs/v6/plugins/',96 ].join(' ')97 )98 );99 });100 it('handles included plugin props', () => {101 const prop = 'followCursor';102 const plugins = [{name: prop, fn: () => ({})}];103 validateProps({[prop]: true});104 expect(console.warn).toHaveBeenCalledWith(105 ...getFormattedMessage(106 [107 `\`${prop}\``,108 "is not a valid prop. You may have spelled it incorrectly, or if it's",109 'a plugin, forgot to pass it in an array as props.plugins.',110 '\n\n',111 'All props: https://atomiks.github.io/tippyjs/v6/all-props/\n',112 'Plugins: https://atomiks.github.io/tippyjs/v6/plugins/',113 ].join(' ')114 )115 );116 console.warn.mockClear();117 validateProps({[prop]: true}, plugins);118 expect(console.warn).not.toHaveBeenCalled();119 });120 it('handles custom plugin props', () => {121 const prop = '__custom';122 const plugins = [{name: prop, fn: () => ({})}];123 validateProps({[prop]: true});124 expect(console.warn).toHaveBeenCalledWith(125 ...getFormattedMessage(126 [127 `\`${prop}\``,128 "is not a valid prop. You may have spelled it incorrectly, or if it's",129 'a plugin, forgot to pass it in an array as props.plugins.',130 '\n\n',131 'All props: https://atomiks.github.io/tippyjs/v6/all-props/\n',132 'Plugins: https://atomiks.github.io/tippyjs/v6/plugins/',133 ].join(' ')134 )135 );136 console.warn.mockClear();137 validateProps({[prop]: true}, plugins);138 expect(console.warn).not.toHaveBeenCalled();139 });...
validate.js
Source: validate.js
1/** @jsx dom */2import assert from 'assert'3import {dom,deku} from '../../'4import {mount} from '../helpers'5function div() {6 return <div></div>;7}8describe('validation', function () {9 it('should validate missing props when first rendered', function(done){10 var Component = {11 render: div,12 propTypes: {13 'text': { type: 'string' }14 }15 }16 var app = deku()17 app.option('validateProps', true)18 app.mount(<Component />);19 mount(app, null, function(e){20 assert.equal(e.message, 'Missing property: text');21 done();22 })23 })24 it('should validate props types when first rendered', function(done){25 var Component = {26 render: div,27 propTypes: {28 'text': { type: 'string' }29 }30 }31 var app = deku()32 app.option('validateProps', true)33 app.mount(<Component text={true} />);34 mount(app, null, function(e){35 assert.equal(e.message, 'Invalid property type: text');36 done();37 })38 })39 it('should validate unexpected prop values when first rendered', function (done) {40 var Component = {41 render: div,42 propTypes: {43 'text': { type: 'string', expects: ['foo', 'bar', 'baz'] }44 }45 }46 var app = deku()47 app.option('validateProps', true)48 app.mount(<Component text="raz" />);49 mount(app, null, function(e){50 assert.equal(e.message, 'Invalid property value: text');51 done();52 })53 });54 it('should validate expected prop values when first rendered', function () {55 var Component = {56 render: div,57 propTypes: {58 'text': { type: 'string', expects: ['foo', 'bar', 'baz'] }59 }60 }61 var app = deku()62 app.option('validateProps', true)63 app.mount(<Component text="foo" />);64 mount(app)65 });66 it('should skip optional props when first rendered', function(){67 var Component = {68 render: div,69 propTypes: {70 'text': { type: 'string', optional: true }71 }72 }73 var app = deku()74 app.option('validateProps', true)75 app.mount(<Component />);76 mount(app)77 })78 it('should validate unknown properties', function(done){79 var Component = {80 render: div81 }82 var app = deku()83 .option('validateProps', true)84 .mount(<Component text="foo" />);85 mount(app, null, function(e){86 assert.equal(e.message, 'Unexpected property: text');87 done();88 })89 })90 it('should not validate if the option is not set', function () {91 var Component = {92 render: div93 }94 var app = deku()95 .option('validateProps', false)96 .mount(<Component text="foo" />);97 mount(app)98 });99 it('should validate nested types', function (done) {100 var Component = {101 render: div,102 propTypes: {103 'data': {104 type: {105 'text': { type: 'string' }106 }107 }108 }109 }110 var app = deku()111 app.option('validateProps', true)112 app.mount(<Component data={{ text: true }} />);113 mount(app, null, function(e){114 assert.equal(e.message, 'Invalid property type: data.text');115 done();116 })117 });118 it('should validate missing nested types', function (done) {119 var Component = {120 render: div,121 propTypes: {122 'data': {123 type: {124 'text': { type: 'string' }125 }126 }127 }128 }129 var app = deku()130 app.option('validateProps', true)131 app.mount(<Component />);132 mount(app, null, function(e){133 assert.equal(e.message, 'Missing property: data');134 done();135 })136 });137 it('should allow optional nested types', function () {138 var Component = {139 render: div,140 propTypes: {141 'data': {142 type: {143 'text': { type: 'string', optional: true }144 }145 }146 }147 }148 var app = deku()149 app.option('validateProps', true)150 app.mount(<Component data={{}} />);151 mount(app)152 });...
index.js
Source: index.js
...6 samplefac: 10,7 netsize: 256,8 format: 'rgb'9 }10 expect(validateProps(props)).toBe(true)11 })12 it('returns `false` if the sampling factor is missing', function () {13 expect(validateProps({samplefac: NaN, netsize: 16, format: 'hex'})).toBe(false)14 })15 it('returns `false` if the sampling factor is below the minimum', function () {16 expect(validateProps({samplefac: 0, netsize: 16, format: 'hex'})).toBe(false)17 })18 it('returns `false` if the sampling factor is above the maximum', function () {19 expect(validateProps({samplefac: 31, netsize: 16, format: 'hex'})).toBe(false)20 })21 it('returns `false` if the network size is missing', function () {22 expect(validateProps({samplefac: 10, netsize: NaN, format: 'hex'})).toBe(false)23 })24 it('returns `false` if the network size is below the minimum', function () {25 expect(validateProps({samplefac: 10, netsize: 3, format: 'hex'})).toBe(false)26 })27 it('returns `false` if the network size is above the maximum', function () {28 expect(validateProps({samplefac: 10, netsize: 257, format: 'hex'})).toBe(false)29 })30 it('returns `false` if the format is not supported', function () {31 expect(validateProps({samplefac: 10, netsize: 16, format: 'rgba'})).toBe(false)32 })33 it('returns `false` if the `custom` flag is present', function () {34 expect(validateProps({samplefac: 10, netsize: 16, format: 'rgb', custom: true})).toBe(false)35 })36 })...
seed.js
Source: seed.js
1import { ValidateProps } from '@/api-lib/constants';2import {3 findUserByEmail,4 findUserByUsername,5 insertRole,6 insertUser,7 findRoleByRoleName,8} from '@/api-lib/db';9import { database, validateBody } from '@/api-lib/middlewares';10import { ncOpts } from '@/api-lib/nc';11import { slugUsername } from '@/lib/user';12import nc from 'next-connect';13import isEmail from 'validator/lib/isEmail';14import normalizeEmail from 'validator/lib/normalizeEmail';15const handler = nc(ncOpts);16handler.use(database);17handler.get(18 // validateBody({19 // type: 'object',20 // properties: {21 // roleName: ValidateProps.role.roleName,22 // C: ValidateProps.role.C,23 // R: ValidateProps.role.R,24 // U: ValidateProps.role.U,25 // D: ValidateProps.role.D,26 // },27 // required: ['roleName', 'C', 'R', 'U', 'D'],28 // additionalProperties: false,29 // }),30 async (req, res) => {31 const { roleName, C, R, U, D } = {32 roleName: 'Customer',33 C: '1',34 R: '1',35 U: '1',36 D: '1',37 };38 if (await findRoleByRoleName(req.db, roleName)) {39 res40 .status(403)41 .json({ error: { message: 'The roleName has already been taken.' } });42 return;43 }44 const role = await insertRole(req.db, { roleName, C, R, U, D });45 const role2 = await insertRole(req.db, {46 roleName: 'Customer2',47 C: '1',48 R: '1',49 U: '1',50 D: '1',51 });52 const role3 = await insertRole(req.db, {53 roleName: 'Customer3',54 C: '1',55 R: '1',56 U: '1',57 D: '1',58 });59 res.json({ role });60 }61);...
validate.test.js
Source: validate.test.js
...6 container = document.querySelectorAll('.container');7});8describe('validate props', () => {9 it('return true without options', () => {10 expect(validateProps()).toBe(false);11 });12 it('target must be object type', () => {13 expect(validateProps({ target: '.something' })).toBe(false);14 });15 it('data must be required and array of object type.', () => {16 expect(validateProps({ target: container })).toBe(false);17 expect(validateProps({ target: container, data: {} })).toBe(false);18 expect(validateProps({ target: container, data: [{}] })).toBe(false);19 expect(validateProps({ target: container, ...sampleProps })).toBe(true);20 });...
Using AI Code Generation
1const { validateProps } = require('playwright/lib/server/supplements/utils/validation');2const { validateProps } = require('playwright/lib/server/supplements/utils/validation');3const { validateProps } = require('playwright/lib/server/supplements/utils/validation');4const { validateProps } = require('playwright/lib/server/supplements/utils/validation');5const { validateProps } = require('playwright/lib/server/supplements/utils/validation');6const { validateProps } = require('playwright/lib/server/supplements/utils/validation');7const { validateProps } = require('playwright/lib/server/supplements/utils/validation');8const { validateProps } = require('playwright/lib/server/supplements/utils/validation');9const { validateProps } = require('playwright/lib/server/supplements/utils/validation');10const { validateProps } = require('playwright/lib/server/supplements/utils/validation');11const { validateProps } = require('playwright/lib/server/supplements/utils/validation');12const { validateProps } = require('playwright/lib/server/s
Using AI Code Generation
1const { validateProps } = require('playwright/lib/utils/validator');2const { Page } = require('playwright');3const { assert } = require('chai');4describe('Playwright Internal API', () => {5 it('validateProps', () => {6 const page = new Page();7 validateProps(page, 'Page', { foo: 'string' });8 validateProps(page, 'Page', { foo: 'string', bar: 'number' });9 validateProps(page, 'Page', { foo: 'string', bar: 'number', baz: 'boolean' });10 validateProps(page, 'Page', { foo: 'string', bar: 'number', baz: 'boolean', qux: 'object' });11 validateProps(page, 'Page', { foo: 'string', bar: 'number', baz: 'boolean', qux: 'object', quux: 'function' });12 validateProps(page, 'Page', { foo: 'string', bar: 'number', baz: 'boolean', qux: 'object', quux: 'function', corge: 'symbol' });13 validateProps(page, 'Page', { foo: 'string', bar: 'number', baz: 'boolean', qux: 'object', quux: 'function', corge: 'symbol', grault: 'undefined' });
Using AI Code Generation
1const { validateProps } = require('@playwright/test/lib/server/frames');2const page = await context.newPage();3const frame = page.mainFrame();4console.log(frame.url());5const { validateProps } = require('@playwright/test/lib/server/frames');6const page = await context.newPage();7const frame = page.mainFrame();8console.log(frame.url());9const { validateProps } = require('@playwright/test/lib/server/frames');10const page = await context.newPage();11const frame = page.mainFrame();12console.log(frame.url());13const page = await context.newPage();14const page = await context.newPage();15const page = await context.newPage();
Using AI Code Generation
1const { validateProps } = require('playwright-core/lib/server/supplements/utils/validate');2const { assert } = require('chai');3const options = {4 waldo: Symbol('waldo'),5 fred: () => {},6 plugh: {},7};8const result = validateProps(options, {9 foo: { type: 'string' },10 baz: { type: 'number' },11 qux: { type: 'string', nullable: true },12 quuz: { type: 'boolean' },13 corge: { type: 'boolean' },14 grault: { type: 'null' },15 garply: { nullable: true },16 waldo: { type: 'symbol' },17 fred: { type: 'function' },18 plugh: { type: 'object' },19 xyzzy: { type: 'array' },20});21assert.deepEqual(result, {22 waldo: Symbol('waldo'),23 fred: () => {},24 plugh: {},25});26const { validateProps } = require('playwright-core/lib/server/supplements/utils/validate');27const { assert } = require('chai');28const options = {29 waldo: Symbol('waldo'),30 fred: () => {},31 plugh: {},32};33const result = validateProps(options, {34 foo: { type: 'string' },35 baz: { type: 'number' },36 qux: { type: 'string', nullable: true },37 quuz: { type: 'boolean' },38 corge: { type: 'boolean' },39 grault: { type: 'null' },
Using AI Code Generation
1const { validateProps } = require('@playwright/test').internal;2const { MyComponent } = require('./component');3const props = {4 onClick: () => console.log('clicked!'),5};6validateProps(MyComponent, props);7const { Component } = require('react');8class MyComponent extends Component {9 render() {10 return <div id={this.props.id} onClick={this.props.onClick} />;11 }12}13module.exports = { MyComponent };14const { validateProps } = require('@playwright/test').internal;15const { MyComponent } = require('./component');16const props = {17 onClick: () => console.log('clicked!'),18};19validateProps(MyComponent, props);20const { Component } = require('react');21class MyComponent extends Component {22 render() {23 return <div id={this.props.id} onClick={this.props.onClick} />;24 }25}26module.exports = { MyComponent };
Jest + Playwright - Test callbacks of event-based DOM library
firefox browser does not start in playwright
Is it possible to get the selector from a locator object in playwright?
How to run a list of test suites in a single file concurrently in jest?
Running Playwright in Azure Function
firefox browser does not start in playwright
This question is quite close to a "need more focus" question. But let's try to give it some focus:
Does Playwright has access to the cPicker object on the page? Does it has access to the window object?
Yes, you can access both cPicker and the window object inside an evaluate call.
Should I trigger the events from the HTML file itself, and in the callbacks, print in the DOM the result, in some dummy-element, and then infer from that dummy element text that the callbacks fired?
Exactly, or you can assign values to a javascript variable:
const cPicker = new ColorPicker({
onClickOutside(e){
},
onInput(color){
window['color'] = color;
},
onChange(color){
window['result'] = color;
}
})
And then
it('Should call all callbacks with correct arguments', async() => {
await page.goto(`http://localhost:5000/tests/visual/basic.html`, {waitUntil:'load'})
// Wait until the next frame
await page.evaluate(() => new Promise(requestAnimationFrame))
// Act
// Assert
const result = await page.evaluate(() => window['color']);
// Check the value
})
Check out the latest blogs from LambdaTest on this topic:
Native apps are developed specifically for one platform. Hence they are fast and deliver superior performance. They can be downloaded from various app stores and are not accessible through browsers.
One of the essential parts when performing automated UI testing, whether using Selenium or another framework, is identifying the correct web elements the tests will interact with. However, if the web elements are not located correctly, you might get NoSuchElementException in Selenium. This would cause a false negative result because we won’t get to the actual functionality check. Instead, our test will fail simply because it failed to interact with the correct element.
Smartphones have changed the way humans interact with technology. Be it travel, fitness, lifestyle, video games, or even services, it’s all just a few touches away (quite literally so). We only need to look at the growing throngs of smartphone or tablet users vs. desktop users to grasp this reality.
As part of one of my consulting efforts, I worked with a mid-sized company that was looking to move toward a more agile manner of developing software. As with any shift in work style, there is some bewilderment and, for some, considerable anxiety. People are being challenged to leave their comfort zones and embrace a continuously changing, dynamic working environment. And, dare I say it, testing may be the most ‘disturbed’ of the software roles in agile development.
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!