Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
test: add initial unit test suite (#321)
* some unit tests modifications made by agilgur5 to brekk's original commit: - rebase with `master` that is 3 years newer - fix conflicts with newer code, esp the `tsModule`/`tsProxy` changes in this commit - move `jest` config to the bottom and don't reformat `package.json` with tabs * more modifications made by agilgur5 to brekk's original commit: - fix merge conflicts with code that is 3 years newer * fix tests for windows * flip that test * deps: upgrade Jest to v28 - and ts-jest to v28 - @types/jest doesn't have a v28 yet - look ma, no more vulns! * refactor: split jest config to jest.config.js - and add JSDoc typings to it - per https://jestjs.io/docs/configuration * clean: remove redundant jest config - most of these options are either unused (like `modulePaths` etc) or covered by Jest's defaults (`moduleFileExtensions`, `testMatch`, etc) - also use `ts-jest` preset per its docs and migration docs - https://kulshekhar.github.io/ts-jest/docs/migration * refactor: move tests into __tests__ dir - per ezolenko's request, though I also prefer to separate them - fix all relative imports to use `../src/` now formatting changes: - improve ordering of imports in tests -- externals first, newline, then internal imports - do this **consistently** - consistently put spaces around braces in destructured imports - really need better linting (and update to ESLint) - consistently add newline after imports and before declarations - in general, add more newlines for readability in several files * deps: import from @jest/globals instead of using globals - no config needed and uses standard imports too - also required for future Jest ESM support I believe - I created the `jest-without-globals` package before this feature was released in Jest core and contributed a PR for it too, so might have a bias toward not using globals * fix(test): update get-options-overrides spec to match latest file - basically to match the changes I made when fixing declaration map sources ~1.5 years ago in ec0568b - also to add `cwd` to options - fix: use `toStrictEqual` everywhere, in order to actually check `undefined` properties, as this is necessary for some of the checks - I believe the original author may have intended to actually check `undefined` given that they wrote it in the test, but maybe did not know to use `toStrictEqual` instead of `toEqual` * refactor(test): use obj spread in get-options-overrides - instead of re-writing the options multiple times, write up some defaults and use object spread - and refactor `makeDefaultConfig()` to just use `{ ...defaultConfig }` instead to match the rest - re-write normalizePaths to be a `for ... of` loop instead of using `Array.map` - simpler / more straightforward than a function with side-effects - feat: add typings in several places - that's why we're using TS and ts-jest right?? * fix(test): update host spec to match latest source - LanguageServiceHost now requires 3rd argument, cwd, so add that to all usage - add afterDecalarations to transformers - Jest's test.skip can now use async/await, so do that - it was also giving a type error, and this is simpler anyway - change expected to use `__tests__` directory now - fix: use `expect.arrayContaining` for `host.getDirectories` test as there are more temp directories that get added here, such as `build-self` and `coverage` - in general, might be less fragile if this used a generated directory instead of an actual one - but save bigger refactors for later * refactor(test): use async/await, remove truncate func in host spec - instead of using Promises with `done()`, use async/await for clearer code and less indentation too - remove the `truncateName` function as it's not needed; `local` will result in the same name - remove commented out test code - this seemed to just be there for testing the code, and not ready-for-production comments * refactor: use consts in host spec instead of locals - basically using pre-defined fixture vars instead of ones defined inside the test - which is more straightforward, easier to read, and less fragile - shorter names too - also use a __temp dir for auto-generated files instead of creating them in the same dir and confusing the editor file tree and potential watchers - change jest config to make sure only spec files are being watched - gitignore __tests__/__temp/ dir in case tests crash etc * fix(test): update rollupcontext spec to match latest source - use PluginContext and IContext types instead of `any` - we're using TypeScript right?? - add `debug` level logging in a few places where it was missing - update stubbedContext to have latest PluginContext properties - watcher isn't in there anymore and a few new properties were added - fix type errors with stubbedContext - give it an intersection with IContext for `info` and `debug` verbosity levels - force the logging funcs to `any` as they don't quite match the Rollup types - force them to `any` when deleting them as well because they're not optional properties - Note: would be good to not force so much `any` if possible, but this may be difficult without more advanced internal Rollup mocks - couldn't find any testing packages for this :/ - test: add verbosity expect for debug too - refactor: context2 -> context - there wasn't another one, so just use the same name consistently - I'm guessing there was another one at some point in the development of this and then it was removed but not renamed * lint: add __tests__ to lint dirs, fix lint errors - surprisingly only in jest.config.js? - really need to update to @typescript-eslint ... * ci: add unit tests to matrix - run after all the builds for now - it can be done in parallel as a separate job, but then have to duplicate the NPM install etc, so may not be optimal that way - refactor: add test:watch and test:coverage scripts - shortcut scripts so don't have to `npm test -- --coverage" etc - also remove `--verbose` from `test` as that's not necessary * test: add unit tests for createFilter - increases coverage of get-options-overrides significantly - couldn't figure out `rootDirs` -- either the code or my tests are wrong, so just skip that one for now - refactor: move makeStubbedContext etc into a shared fixtures dir so that it can be used for both rollupcontext tests _and_ createFilter tests - in my stylistic opinion, I prefer to put nearly _all_ consts like these into fixtures dir - configure jest to ignore test helpers in coverage reporting such as fixture files - format: '' -> "", add semicolon in some places - I use single quotes and no semicolons, so missed that in a few places - lint didn't check for that and no prettier auto-format :/ * refactor: use consts, async/await, etc in rollingcache spec - basically using pre-defined fixture vars instead of ones defined inside the test - which is more straightforward, easier to read, and less fragile - shorter names too - left a couple of ones as is where they were only used once very quickly -- could make them fixture vars too but 🤷 - use async/await instead of Promises with `done()` etc - also use more `fs-extra` functions that support Promises instead of synchronous `fs` functions (e.g. `existsSync` -> `pathExists`) - async should be a small optimization for tests too - fix: use __temp dir for auto-generated files instead of creating them in a fixtures dir and breaking actual fixtures - format: a few multi-line statements were able to be condensed to a single line, so do so - esp as multi-line was not helping readability since this is just irrelevant test data (may have hampered readability actually) * docs: add a testing section to CONTRIBUTING.md - goes over the different ways of running the tests (watch + coverage) - line about unit and integration tests was moved into this section - and altered to reflect the current state of the repo now that a good amount of unit tests exist - also move "Linting and Style" into its own section with a list - move "fix any failed PR checks" to the top as overall guidance on making a PR - previously it was in the middle of linting and style, which felt a bit disjointed (maybe made sense earlier before builds were in CI?) - name the last section "Building and Self-Build"; leave content as is - well mostly, change the first line as "fastest way to test" is not necessarily accurate anymore now that there are actual tests * fix(test): undo tsTypes -> tsModules changes in source code - original author, brekk, had made these changes, likely because without them, the tests would throw in the source lines where `tsModule` was used with things like "Cannot read property 'ModuleKind' of undefined" - the actual fix for this is to instead use `setTypescriptModule` from tsproxy as this is how it is used in the source - it's mainly needed for when an alternate TS is substituted - brekk probably didn't know the codebase well enough to know that - add `setTypescriptModule` to all specs that need it - 100% test coverage of tsproxy now too! - this should hopefully fix the build errors we were getting as well * test: get host spec customTransformers test working - it seemed incomplete and that's why it was skipped, no comment there stating otherwise, so just modified it a bit to get it to work and pass properly * ci: add Node 14, 16, 18, and macOS, Windows to matrix - drop Node 10 testing - Node 10 went EoL a while ago and was causing the latest version of Jest to throw an error - still test Node 12 since it only went EoL recently, but could drop it as well if wanted - may want to set `package.json#engines` or update min requirements in the README if so, though it likely still works on older Node, we just can't easily test it - add macOS and Windows testing to the matrix since TS and Rollup both behave differently on different OSes, in particular with regard to the filesystem - POSIX paths on Windows, case-insensitivity on macOS - give the job a name that appears in the PR checks and Actions tab * refactor: use __temp dir in options-overrides spec - similar to previous commits, don't use the actual fixtures dir, use the `__temp` dir and a subfolder within for this spec file specifically so as to not interfere with other tests * test: 100% coverage for host.ts, refactor host.spec.ts - test: get the skipped `readFile` test to work - `ts.sys.readFile` definitely returns stuff, it's used for snapshots - it wasn't working because it was testing the wrong extension, `.js` instead of `.ts` - I thought this was intentional when I first added consts here, but turns out that was actually a mistake by the original author - refactor: merge the `readFile` tests with the main test suite - first I merged them together, but as they were just one-liners, I merged them with the first set, since it wasn't particularly different from those - refactor: split up the main test suite into a few commented sections - core snapshot functionality, fs functionality, misc - a lot less random now - refactor: use `getDirectories` on the testDir instead of project root - much less fragile to use the dir generated here, and no hack-ish `arrayContaining()` either - refactor: one-line the case-insensitive test - that simplifies it a lot! - refactor: use fixed consts for the repetitive default config - and use a `testOpts` variable for less fragile testing - test: add tests for version 2 branches of snapshot funcs - these weren't tested before so it had only tested the `|| 0` branch of the conditional - also actually test `reset` instead of calling it at the beginning - refactor: no more "dirty checking" of instances' private interfaces - we're testing it all through the public interfaces instead! - test: add a simple test for the new `trace` method - test: coverage for `after` and `afterDeclarations` transformers - test: coverage for different `undefined` states of transformers - refactor the two test suites as one for `undefined` and one for all 3 transformers - and put the working one first for naming purposes - refactor the `setLanguageService` call as a simpler type coercion - remove the transformer interactions in the main test suite - yea, this is a big commit, but I was refactoring everything anyway and this is probably gonna be squashed anyway * refactor: remove remaining "dirty checking of instance as any" - no need to check private interfaces in these remaining tests, the functionality itself is already tested via the public interface * fix(test): get tests working on Ubuntu and Windows - host is only case-sensitive on Linux - prev was everything except Windows; so flipped the conditional a bit - host and TS itself use "/" normalized paths, so use those - and add a hacky workaround for a TS bug I managed to find - formatHost will use OS separators, so no "/" - make the test more accurate and less fragile by comparing to `process.cwd()` as well -- which should normalize on Windows * refactor: use consts and shrink check-tsconfig - think it's a bit easier to read this way, it's only 3 tests after all * refactor: remove normalizePaths func from get-options-overrides spec - this isn't necessary and added some complexity (and verbosity) - only one dir that needs normalization anymore, and that's just the cache dir, so just add it to the const/var fixture instead - shrink the code a bit as a result too - and use a bit different code style to shrink it too - annnd found a Windows bug in get-options-overrides.ts here too... - leave a `// TODO: ` comment here to fix the source as this PR is solely focused on tests (i.e. no source changes) Co-authored-by: Brekk <brekk@brekkbockrath.com> Co-authored-by: bbockrath <bbockrath@goodgamestudios.com>
- Loading branch information