Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 61 additions & 6 deletions src/hooks/useFilteredTestCases.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,8 @@ interface ProviderProps {
defaultHideStatuses?: readonly TestStepResultStatus[]
}

function renderAndExtractPickleNames({
envelopes,
defaultQuery,
defaultHideStatuses,
}: ProviderProps) {
return renderHook(() => useFilteredTestCases().map(({ pickle }) => pickle.name), {
function renderFilteredTestCases({ envelopes, defaultQuery, defaultHideStatuses }: ProviderProps) {
return renderHook(useFilteredTestCases, {
wrapper: ({ children }) => (
<EnvelopesProvider envelopes={envelopes}>
<InMemorySearchProvider
Expand All @@ -36,6 +32,18 @@ function renderAndExtractPickleNames({
})
}

function renderAndExtractPickleNames(props: ProviderProps) {
const { result, ...rest } = renderFilteredTestCases(props)
return {
result: {
get current() {
return (result.current.results ?? []).map(({ pickle }) => pickle.name)
},
},
...rest,
}
}

describe('useFilteredTestCases', () => {
describe('with no filters', () => {
it('returns a test case for every finished scenario', async () => {
Expand Down Expand Up @@ -148,4 +156,51 @@ describe('useFilteredTestCases', () => {
expect(result.current).to.include('another scenario')
})
})

describe('readiness', () => {
it('leaves results undefined while the search is still running', () => {
const { result } = renderFilteredTestCases({ envelopes: retry, defaultQuery: 'third' })

expect(result.current.results).to.equal(undefined)
})

it('populates results once the search resolves', async () => {
const { result } = renderFilteredTestCases({ envelopes: retry, defaultQuery: 'third' })

await waitFor(() => expect(result.current.results).not.to.equal(undefined))
})
})

describe('the filtered flag', () => {
it('is false when no criteria are active', async () => {
const { result } = renderFilteredTestCases({ envelopes: hooksConditional })

await waitFor(() => expect(result.current.results).to.have.lengthOf(3))
expect(result.current.filtered).to.equal(false)
})

it('is true when a tag expression is active', async () => {
const { result } = renderFilteredTestCases({
envelopes: hooksConditional,
defaultQuery: '@fail-before',
})

await waitFor(() => expect(result.current.filtered).to.equal(true))
})

it('is true when a text search is active', async () => {
const { result } = renderFilteredTestCases({ envelopes: retry, defaultQuery: 'third' })

await waitFor(() => expect(result.current.filtered).to.equal(true))
})

it('is true when statuses are hidden', async () => {
const { result } = renderFilteredTestCases({
envelopes: retry,
defaultHideStatuses: [TestStepResultStatus.FAILED],
})

await waitFor(() => expect(result.current.filtered).to.equal(true))
})
})
})
14 changes: 10 additions & 4 deletions src/hooks/useFilteredTestCases.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,16 @@ import { useQueries } from './useQueries.js'
import { useSearch } from './useSearch.js'
import { useSearchResult } from './useSearchResult.js'

export function useFilteredTestCases(): ReadonlyArray<ExpandedTestCase<TestCaseFinished>> {
export function useFilteredTestCases(): {
results?: ReadonlyArray<ExpandedTestCase<TestCaseFinished>>
filtered: boolean
} {
const { cucumberQuery } = useQueries()
const allTestCasesFinished = useMemo(
() => cucumberQuery.findAllTestCaseFinished(),
[cucumberQuery]
)
const { hideStatuses, tagExpression } = useSearch()
const { hideStatuses, tagExpression, unchanged } = useSearch()
const candidates = useMemo(
() =>
filterAndExpandTestCaseEvents(cucumberQuery, allTestCasesFinished, {
Expand All @@ -25,7 +28,7 @@ export function useFilteredTestCases(): ReadonlyArray<ExpandedTestCase<TestCaseF
[allTestCasesFinished, cucumberQuery, hideStatuses, tagExpression]
)
const searchResult = useSearchResult()
const [results, setResults] = useState<ReadonlyArray<ExpandedTestCase<TestCaseFinished>>>([])
const [results, setResults] = useState<ReadonlyArray<ExpandedTestCase<TestCaseFinished>>>()

useEffect(() => {
switch (searchResult.status) {
Expand All @@ -43,5 +46,8 @@ export function useFilteredTestCases(): ReadonlyArray<ExpandedTestCase<TestCaseF
}
}, [candidates, searchResult])

return results
return {
results,
filtered: !unchanged,
}
}