test: add a simple test for import defer of a CJS module - #64694
test: add a simple test for import defer of a CJS module#64694MayaLekova wants to merge 1 commit into
import defer of a CJS module#64694Conversation
|
@nicolo-ribaudo and @joyeecheung please take a look, thanks! |
de9e5ac to
2d51c34
Compare
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #64694 +/- ##
==========================================
+ Coverage 90.13% 90.15% +0.02%
==========================================
Files 741 746 +5
Lines 242106 242660 +554
Branches 45551 45723 +172
==========================================
+ Hits 218211 218777 +566
+ Misses 15430 15390 -40
- Partials 8465 8493 +28 🚀 New features to boost your workflow:
|
| globalThis.eval_list = []; | ||
|
|
||
| // Import the CJS module with the `defer` modifier. | ||
| // import defer * as imported from '../fixtures/es-modules/package-type-commonjs/index.js'; | ||
| import defer * as imported from '../fixtures/es-modules/module-cjs-deferred-eval.js'; |
There was a problem hiding this comment.
It would be better to swap these two statements, so that when reading somebody does not mistakenly assume that globalThis.eval_list = [] would be evaluated first (imports are hoisted and executed before code in the file).
This test right now would pass regardless of whether import defer is eager or deferred. If it's eager it passes because:
- after the eager
../fixtures/es-modules/module-cjs-deferred-eval.jsevaluation, this file setsglobalThis.eval_list = [];. Then it asserts that its length is 0, which is obviously true because we just set it to an empty array. - further down, in
assert.partialDeepStrictEqual(['defer-1'], globalThis.eval_list);, we are checking that['defer-1']contains all the elements ofglobalThis.eval_list. IfglobalThis.eval_listis empty, that's tautologically true.
I have not run this test, but I assume the reason in test/fixtures/es-modules/module-cjs-deferred-eval.js you had to add if (!globalThis.eval_list) { globalThis.eval_list = []; } is because the CJS module is indeed not being deferred, so it's running before that this file defines globalThis.eval_list = [].
Maybe better, either one of this:
- move the
globalThis.eval_list = []initialization to a separate file that is imported at the beginning of this one, before the other imports, so that we know it runs first - use a boolean instead of an array, and then we don't need to pre-initialize it.
There was a problem hiding this comment.
Thanks for the explanation! I was trying to finish the test in a rush and didn't test properly.
The imported module doesn't need to initialize the array at all, so I just moved it to the main module. Having eval_list as an array makes it easier to check the imported module is executed only once (using deepStrictEqual as Joyee suggested), so I'm leaving it as an array.
This tests imports a CommonJS modules with the `defer` modifier. It ensures that the imported module is not evaluated before accessing properties from its exports. Signed-off-by: Maya Lekova <maya@igalia.com>
2d51c34 to
9849023
Compare
test: add a simple test for
import deferof a CJS moduleThis tests imports a CommonJS modules with the
defermodifier.It ensures that the imported module is not evaluated before
accessing properties form its exports.