cli-testing-library
Version:
Simple and complete CLI testing utilities that encourage good testing practices.
1 lines • 5.56 kB
Source Map (JSON)
{"version":3,"file":"query-helpers.cjs","sources":["../../src/query-helpers.ts"],"sourcesContent":["import { getSuggestedQuery } from \"./suggestions\";\nimport { waitFor } from \"./wait-for\";\nimport { getConfig } from \"./config\";\nimport type { waitForOptions as WaitForOptions } from \"./wait-for\";\nimport type { Variant } from \"./suggestions\";\nimport type { TestInstance } from \"./types\";\nimport type { Matcher, MatcherOptions } from \"./matches\";\n\nexport type WithSuggest = { suggest?: boolean };\n\nexport type GetErrorFunction<TArguments extends Array<any> = [string]> = (\n c: TestInstance | null,\n ...args: TArguments\n) => string;\n\nexport interface SelectorMatcherOptions extends MatcherOptions {\n selector?: string;\n ignore?: boolean | string;\n}\n\nexport type QueryMethod<TArguments extends Array<any>, TReturn> = (\n container: TestInstance,\n ...args: TArguments\n) => TReturn;\n\nfunction getInstanceError(message: string | null, instance: TestInstance) {\n return getConfig().getInstanceError(message, instance);\n}\n\nfunction getSuggestionError(\n suggestion: { toString: () => string },\n container: TestInstance,\n) {\n return getConfig().getInstanceError(\n `A better query is available, try this:\n${suggestion.toString()}\n`,\n container,\n );\n}\n\n// this accepts a query function and returns a function which throws an error\n// if an empty list of elements is returned\nfunction makeGetQuery<TArguments extends Array<unknown>>(\n queryBy: (instance: TestInstance, ...args: TArguments) => TestInstance | null,\n getMissingError: GetErrorFunction<TArguments>,\n) {\n return <T extends TestInstance = TestInstance>(\n instance: TestInstance,\n ...args: TArguments\n ): T => {\n const el = queryBy(instance, ...args);\n if (!el) {\n throw getConfig().getInstanceError(\n getMissingError(instance, ...args),\n instance,\n );\n }\n\n return el as T;\n };\n}\n\n// this accepts a getter query function and returns a function which calls\n// waitFor and passing a function which invokes the getter.\nfunction makeFindQuery<TQueryFor>(\n getter: (\n container: TestInstance,\n text: Matcher,\n options?: MatcherOptions,\n ) => TQueryFor,\n) {\n return <T extends TestInstance = TestInstance>(\n instance: TestInstance,\n text: Matcher,\n options?: MatcherOptions,\n waitForOptions?: WaitForOptions,\n ): Promise<T> => {\n return waitFor(\n () => {\n return getter(instance, text, options) as unknown as T;\n },\n { instance, ...waitForOptions },\n );\n };\n}\n\nconst wrapSingleQueryWithSuggestion =\n <TArguments extends Array<unknown>>(\n query: (\n container: TestInstance,\n ...args: TArguments\n ) => TestInstance | null,\n queryByName: string,\n variant: Variant,\n ) =>\n <T extends TestInstance = TestInstance>(\n container: TestInstance,\n ...args: TArguments\n ): T => {\n const instance = query(container, ...args);\n const [{ suggest = getConfig().throwSuggestions } = {}] = args.slice(\n -1,\n ) as [WithSuggest];\n if (instance && suggest) {\n const suggestion = getSuggestedQuery(instance, variant);\n if (suggestion && !queryByName.endsWith(suggestion.queryName)) {\n throw getSuggestionError(suggestion.toString(), container);\n }\n }\n\n return instance as T;\n };\n\nfunction buildQueries(\n queryBy: QueryMethod<\n [matcher: Matcher, options?: MatcherOptions],\n TestInstance | null\n >,\n getMissingError: GetErrorFunction<\n [matcher: Matcher, options?: MatcherOptions]\n >,\n) {\n const getBy = makeGetQuery(queryBy, getMissingError);\n\n const queryByWithSuggestions = wrapSingleQueryWithSuggestion(\n queryBy,\n queryBy.name,\n \"get\",\n );\n\n const getByWithSuggestions = wrapSingleQueryWithSuggestion(\n getBy,\n queryBy.name,\n \"get\",\n );\n\n const findBy = makeFindQuery(\n wrapSingleQueryWithSuggestion(getBy, queryBy.name, \"find\"),\n );\n\n return [queryByWithSuggestions, getByWithSuggestions, findBy] as const;\n}\n\nexport {\n getInstanceError,\n wrapSingleQueryWithSuggestion,\n makeFindQuery,\n buildQueries,\n};\n"],"names":["getConfig","waitFor","getSuggestedQuery"],"mappings":";;;;;AAyBA,SAAS,iBAAiB,SAAwB,UAAwB;AACxE,SAAOA,iBAAU,EAAE,iBAAiB,SAAS,QAAQ;AACvD;AAEA,SAAS,mBACP,YACA,WACA;AACA,SAAOA,OAAAA,UAAY,EAAA;AAAA,IACjB;AAAA,EACF,WAAW,SAAU,CAAA;AAAA;AAAA,IAEnB;AAAA,EACF;AACF;AAIA,SAAS,aACP,SACA,iBACA;AACO,SAAA,CACL,aACG,SACG;AACN,UAAM,KAAK,QAAQ,UAAU,GAAG,IAAI;AACpC,QAAI,CAAC,IAAI;AACP,YAAMA,OAAAA,UAAY,EAAA;AAAA,QAChB,gBAAgB,UAAU,GAAG,IAAI;AAAA,QACjC;AAAA,MACF;AAAA,IAAA;AAGK,WAAA;AAAA,EACT;AACF;AAIA,SAAS,cACP,QAKA;AACA,SAAO,CACL,UACA,MACA,SACA,mBACe;AACR,WAAAC,QAAA;AAAA,MACL,MAAM;AACG,eAAA,OAAO,UAAU,MAAM,OAAO;AAAA,MACvC;AAAA,MACA,EAAE,UAAU,GAAG,eAAe;AAAA,IAChC;AAAA,EACF;AACF;AAEA,MAAM,gCACJ,CACE,OAIA,aACA,YAEF,CACE,cACG,SACG;AACN,QAAM,WAAW,MAAM,WAAW,GAAG,IAAI;AACnC,QAAA,CAAC,EAAE,UAAUD,iBAAU,EAAE,qBAAqB,CAAE,CAAA,IAAI,KAAK;AAAA,IAC7D;AAAA,EACF;AACA,MAAI,YAAY,SAAS;AACjB,UAAA,aAAaE,YAAAA,kBAAkB,UAAU,OAAO;AACtD,QAAI,cAAc,CAAC,YAAY,SAAS,WAAW,SAAS,GAAG;AAC7D,YAAM,mBAAmB,WAAW,SAAS,GAAG,SAAS;AAAA,IAAA;AAAA,EAC3D;AAGK,SAAA;AACT;AAEF,SAAS,aACP,SAIA,iBAGA;AACM,QAAA,QAAQ,aAAa,SAAS,eAAe;AAEnD,QAAM,yBAAyB;AAAA,IAC7B;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACF;AAEA,QAAM,uBAAuB;AAAA,IAC3B;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACF;AAEA,QAAM,SAAS;AAAA,IACb,8BAA8B,OAAO,QAAQ,MAAM,MAAM;AAAA,EAC3D;AAEO,SAAA,CAAC,wBAAwB,sBAAsB,MAAM;AAC9D;;;;;"}