testdouble.js icon indicating copy to clipboard operation
testdouble.js copied to clipboard

replaceEsm not working on windows

Open connorjclark opened this issue 3 years ago • 4 comments
trafficstars

Description

ES modules are not mocked on windows. Works fine on Mac.

Environment

  • [ ] node -v output: 14.8.2
  • [ ] yarn --version output: 1.22.19
  • [ ] npm ls testdouble (or yarn list testdouble) version: 3.16.15

Example Repo

https://github.com/connorjclark/testdouble-win-example

// main.js
import * as td from 'testdouble';

td.replaceEsm('./module.js', {runMe: () => 'replaced'});

const {runMe} = await import('./module.js')

console.log(runMe());
// module.js
export function runMe() {
    return 'original';
}

node --loader=testdouble main.js prints original on windows, replaced on Mac.

connorjclark avatar Jul 01 '22 22:07 connorjclark

Paging @giltayar if he might have any insight 🙏

searls avatar Jul 03 '22 20:07 searls

image

The key in the global modules Map duplicated C:/ for some reason. Also, the slashes are wrong.

Set here:

image

I believe convertUrlToPath is eating the C: portion of the module url (interprets as the protocol), and spits out the path without it.

image

connorjclark avatar Jul 03 '22 21:07 connorjclark

I made the following change inside quibble, which resolved the bug:

image

if (process.platform === 'win32') {
    fullModulePath = callerFile.replace('/C:', 'C:')
    fullModulePath = path.resolve(path.dirname(fullModulePath), importPath)
    fullModulePath = '/' + fullModulePath.split(path.sep).join("/")
  }

Of course, I shouldn't be hardcoding the drive there. But anyway, the real fix is probably something to do with correctly juggling the format of the Error filename / module name / URLs being passed around, being mindful of Windows's differing slashes / existence of a drive suffix.

connorjclark avatar Jul 03 '22 22:07 connorjclark

Thanks for digging into this. Ultimately, if you (or another developer that uses Windows) might consider sending a PR with a test for this that they can assert works OK on windows without breaking anything else, I'd be eager to accept it.

searls avatar Jul 05 '22 12:07 searls

Cloned your repo, updated testdouble to the latest version, and added an await before td.replaceEsm. Got the correct result ("replaced"), so closing this issue.

giltayar avatar Sep 16 '23 10:09 giltayar