coverage-shards.spec.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { readdirSync } from 'node:fs'
  2. import { resolve } from 'node:path'
  3. import { describe, expect, it } from 'vitest'
  4. import { coverageArgs, coverageShards } from './coverage-shards.ts'
  5. const repositoryRoot = resolve(import.meta.dirname, '..')
  6. describe('coverage shards', () => {
  7. it('assigns every workspace package to exactly one lane', () => {
  8. const packagesRoot = resolve(repositoryRoot, 'packages')
  9. const workspacePackages = readdirSync(packagesRoot, { withFileTypes: true })
  10. .filter(group => group.isDirectory())
  11. .flatMap(group => readdirSync(resolve(packagesRoot, group.name), { withFileTypes: true })
  12. .filter(entry => entry.isDirectory())
  13. .map(entry => `${group.name}/${entry.name}`))
  14. .sort()
  15. const assignedPackages = coverageShards.flatMap(shard => shard.packageRoots.flatMap((packageRoot) => {
  16. if (packageRoot.includes('/')) return [packageRoot]
  17. return readdirSync(resolve(packagesRoot, packageRoot), { withFileTypes: true })
  18. .filter(entry => entry.isDirectory())
  19. .map(entry => `${packageRoot}/${entry.name}`)
  20. }))
  21. expect([...assignedPackages].sort()).toEqual(workspacePackages)
  22. expect(new Set(assignedPackages).size).toBe(assignedPackages.length)
  23. })
  24. it.each(coverageShards)('selects tests and source includes for $name', (shard) => {
  25. const args = coverageArgs(shard.name)
  26. for (const packageRoot of shard.packageRoots) {
  27. expect(args).toContain(`packages/${packageRoot}/`)
  28. expect(args).toContain(packageRoot.includes('/')
  29. ? `--coverage.include=packages/${packageRoot}/src/**/*.ts`
  30. : `--coverage.include=packages/${packageRoot}/*/src/**/*.ts`)
  31. }
  32. if ('extraTestRoots' in shard) {
  33. for (const testRoot of shard.extraTestRoots) expect(args).toContain(`${testRoot}/`)
  34. }
  35. expect(args).toContain('scripts/test-invariants.spec.ts')
  36. expect(new Set(args).size).toBe(args.length)
  37. })
  38. it('rejects an unknown lane', () => {
  39. expect(() => coverageArgs('missing')).toThrow('unknown DSH_COVERAGE_SHARD')
  40. })
  41. })