3 Commits

Author SHA1 Message Date
Anton Gilgur
3ef3289fc1
fix: add compatibility checks w/ semver (#424)
* hotfix: `this.load` was added in Rollup `2.60.0`; don't run on older versions

- this is my bad, I didn't realize `this.load` came out _much_ later than `this.resolve`
  - c.f. https://github.com/rollup/rollup/blob/master/CHANGELOG.md#2600

- since we're backward-compatible w/ Rollup `1.26.3`, add in a version check for the type-only fix
  - the type-only fix will error out in Rollup versions less than `2.60.0`, so instead of erroring out, just skip this functionality

- TODO: should move back to using `semver` that was removed in 08d2f5bcad7cb9a9a0974f3707a27d29dd89da7c

* deps: add back `semver` and use for version checking

- reverts the `semver` removal in 08d2f5bcad7cb9a9a0974f3707a27d29dd89da7c
  - add back the TS version range check

- add a Rollup version range check, fixing an old issue
- check `this.load` Rollup version with `semver` instead of string comparison

- add `semver` to `external`s list
  - also remove `resolve` as it's no longer used as of 74f6761ff63863cdb3e92ca1f33640fe6f4fc7db
  - and re-organize the list so that Node built-ins are in one section while deps are in another
    - makes it clearer what we're marking as external

* dx: add a nice warning when `this.load` is not supported

- so it doesn't just silently skip the type-only fix on Rollup versions <2.60.0

* fix(test): add globals for strings that are replaced during build

- `TS_VERSION_RANGE`, `ROLLUP_VERSION_RANGE`, `RPT2_VERSION` were previously only defined during builds, so would cause tests to fail
  - add these vars as (namespaced) globals in the Jest config so that they can be used in tests too
  - if they don't exist on `global` (or if `global` doesn't exist), then use the built strings instead
  - see in-line comments for more details

- also reorder `re` placement to match the usage order in the code
- and fix lint issues (`no-string-literal`)

Co-authored-by: Eugene Zolenko <zolenkoe@gmail.com>
2022-09-20 13:15:10 -06:00
Anton Gilgur
61d78bd2f3
test: add initial integration test suite (#371)
* test: add initial integration test harness

- some additional ts-jest config is needed to parse `index.ts`
  - since Rollup isn't used when importing files during testing, we need to enable `esModuleInterop`
    - the import of `findCacheDir` was immediately erroring without this (and maybe more, but `esModuleInterop` made the import work)
  - add `tsconfig.test.json` for this purpose
  - use `ts-jest` JSDoc types to get types for the ts-jest config as well

- add an integration/ dir in the __tests__/ dir for all integration tests
  - add a fixtures/ dir in there as well for integration test fixtures
    - add a `tsconfig.json` for all fixtures to use
      - basically so that rpt2 source code is not `include`d, though also bc this may be good to customize for fixtures
    - add a simple fixture with "no-errors" that does an import and a type-only import

- add a simple integration test that just ensures that all files are part of the bundle
  - the bundled `index` file and each file's declaration and declaration map
  - and no _other_ files!
  - for Rollup, need to use paths relative to the root of the whole project
    - probably because that is `cwd` when running `jest` from root
    - will probably abstract out helpers here in the future as the test suite grows
  - 70% coverage of `index.ts` with just this one test!

- update CONTRIBUTING.md now that an integration test exists

* refactor: use `local` func for path resolution

- similar to the unit test suite

- also remove the `.only` that I was using during development

* add comparison test for cache / no cache

- should probably do this for each integration test suite

- refactor: split out a `genBundle` func to DRY things up
  - this was bound to happen eventually
    - don't think testing other output formats is necessary since we don't have any specific logic for that, so that is just Rollup behavior
  - take `input` path and rpt2 options as params
    - and add the `tsconfig` as a default
  - add a hacky workaround so that Rollup doesn't output a bunch of warnings in the logs
  - format: use double quotes for strings consistently (my bad, I normally use single quotes in my own repos)

* refactor: use a temp cacheRoot

- so we can clean it up after testing to ensure consistency
  - and so we're not filling up the cache in `node_modules` with testing caches

- also add a comment to one the of the tests

* test: check w/ and w/o declarations + declaration maps

- make sure they don't get output when not asked for

* fix(test): actually test the cache

- `clean: true` also means that no cache is created
  - which is a bit confusing naming, but was requested by a few users and implemented in f15cb84dcc99a0bd20f3afce101c0991683010b6
  - so have to create the bundle one _more_ time to create the cache
    - note that `tscache`'s `getCached` and `isDirty` functions are now actually covered in the coverage report

* fix(ci): increase integration test timeout

- double it bc it was occassionally failing on CI due to timeouts

* test: ensure that JS files are part of bundle too

- ensures that TS understands the JS w/ DTS w/o error
- and that rpt2 filters out JS while Rollup still resolves it on its own (since Rollup understands ESM)
  - similar to testing w/ a different plugin (i.e. literally testing an "integration"), but this is native Rollup behavior in this case where it doesn't need a plugin to understand ESM
- also the first test of actual code contents

- reformat the cache test a bit into its own block since we now have ~3 different sets of tests in the suite

* optim(test): don't need to check cache each time

- this doesn't test a new code path and the first test already tests the entire bundle for the fixture, so the other tests just repeat that

* test: add initial error checking integration tests

- refactor: rename `integration/index.spec` -> `integration/no-errors.spec`
- refactor: split `genBundle` func out into a helper file to be used by multiple integration test suites
  - simplify the `genBundle` within `no-errors` as such

- create new `errors` fixture just with some simple code that doesn't type-check for now
  - add test to check that the exact semantic error pops up
    - and it even tests colors 😮  ...though I was confused for some time why the strings weren't matching... 😐
  - add test to make sure it doesn't pop up when `check: false` or `abortOnError: false`
    - when `abortOnError: false`, detect that a warning is created instead

- due to the new `errors` dir in the fixtures dir, the fixtures `tsconfig` now picks up two dirs
  - which changes the `rootDir` etc
  - so create two tiny `tsconfig`s in both fixture dirs that just extend that one
    - and now tests all run simiarly to before

* fix(ci): increase integration test `errors` timeout

- this too timed out, probably due to the checks that _don't_ error

* optim(test): split non-erroring error tests into a different suite

- so that Jest can parallelize these
  - CI was timing out on this, so splitting it out should help as it'll be 10s each

* fix(ci): bump integration test timeout to 15s

- bc it was still timing out in some cases 😕
  - this time the `no-errors` suite was timing out, so just increase all around

* fix(test): output a `.js` bundle, not `.ts`

- woooops... was wondering why it was `.ts`; turns out because I wrote the `output.file` setting that way 😅 😅 😅

- also add a missing comment in errors for consistency
- and put code checks _after_ file structure checks, since that's a deeper check

* test: check that `emitDeclarationOnly` works as expected

- should output declaration and declaration map for file
  - code + declaration should contain the one-line function
  - code _shouldn't_ contain anything from TS files

- since this is plain ESM code, we don't need another plugin to process this
  - nice workaround to installing another plugin that I hadn't thought of till now!

* test: add a syntactic error, refactor a bit

- add a file to `errors` with a syntax error in it
  - apparently this does throw syntax err, but does not cause `emitSkipped: true`... odd...
    - so may need another test for that...
    - `abortOnError: false` / `check: false` both cause Rollup to error out instead
  - rename `errors/index` -> `errors/semantic` since we have different kinds now
  - change the `include` to only take a single file, so that we don't unnecessarily generate declarations or type-check other error files

- refactor(test): rewrite `genBundle` in both files to take a relative path to a file
  - simplifies the `emitDeclarationOnly` test as we can now just reuse the local `genBundle` instead of calling `helpers.genBundle` directly
  - use the same structure for `errors`'s different files as well

- refactor(test): split `errors.spec` into `tsconfig` errors, semantic errors, and syntactic errors (for now)

- add a slightly hacky workaround to get `fs.remove` to not error
  - seems to be a race condition due to the thrown errors and file handles not being closed immediately on throw (seems like they close during garbage collection instead?)
  - see linked issue in the comment; workaround is to just give it some more time
    - not sure that there is a true fix for this, since an improper close may cause indeterminate behavior

* fix(test): normalize as arguments to `include`

- got a Windows error in CI for the `errors` test suite
2022-07-05 22:14:33 -06:00
Anton Gilgur
56716def97
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 ec0568ba2c8e206372f94164e697b1469bf3f33d
- 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>
2022-05-10 18:04:56 -04:00