-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathjavascript_resolvers_test.go
104 lines (90 loc) · 5.08 KB
/
javascript_resolvers_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package lang_test
import (
"context"
"testing"
"github.com/safedep/code/core"
"github.com/safedep/code/fs"
"github.com/safedep/code/lang"
"github.com/safedep/code/parser"
"github.com/stretchr/testify/assert"
)
var javascriptImportExpectations = []ImportExpectations{
{
filePath: "fixtures/imports.js",
imports: []string{
"ImportNode{ModuleName: express, ModuleItem: , ModuleAlias: express, WildcardImport: false}",
"ImportNode{ModuleName: dotenv, ModuleItem: , ModuleAlias: DotEnv, WildcardImport: false}",
"ImportNode{ModuleName: ./config.js, ModuleItem: , ModuleAlias: config, WildcardImport: false}",
"ImportNode{ModuleName: ../utils/helper.js, ModuleItem: , ModuleAlias: helper, WildcardImport: false}",
"ImportNode{ModuleName: ./data1.json, ModuleItem: , ModuleAlias: jsonData, WildcardImport: false}",
"ImportNode{ModuleName: lodash, ModuleItem: , ModuleAlias: lodash, WildcardImport: false}",
"ImportNode{ModuleName: ./math-utils, ModuleItem: , ModuleAlias: mathUtils, WildcardImport: false}",
"ImportNode{ModuleName: ./dynamic-module.js, ModuleItem: , ModuleAlias: dynamicModule, WildcardImport: false}",
"ImportNode{ModuleName: react-dom, ModuleItem: , ModuleAlias: ReactDOM, WildcardImport: false}",
"ImportNode{ModuleName: react-dom, ModuleItem: render, ModuleAlias: render, WildcardImport: false}",
"ImportNode{ModuleName: react-dom, ModuleItem: flushSync, ModuleAlias: flushIt, WildcardImport: false}",
"ImportNode{ModuleName: constants, ModuleItem: EADDRINUSE, ModuleAlias: EADDRINUSE, WildcardImport: false}",
"ImportNode{ModuleName: constants, ModuleItem: EACCES, ModuleAlias: EACCES, WildcardImport: false}",
"ImportNode{ModuleName: constants, ModuleItem: EAGAIN, ModuleAlias: EAGAIN, WildcardImport: false}",
"ImportNode{ModuleName: chalk/ansi-styles, ModuleItem: hex, ModuleAlias: hex, WildcardImport: false}",
"ImportNode{ModuleName: react, ModuleItem: useEffect, ModuleAlias: useEffect, WildcardImport: false}",
"ImportNode{ModuleName: react, ModuleItem: useState, ModuleAlias: useMyState, WildcardImport: false}",
"ImportNode{ModuleName: buffer, ModuleItem: , ModuleAlias: buffer, WildcardImport: false}",
"ImportNode{ModuleName: cluster, ModuleItem: , ModuleAlias: Cluster, WildcardImport: false}",
"ImportNode{ModuleName: @gilbarbara/eslint-config, ModuleItem: , ModuleAlias: EslintConfig, WildcardImport: false}",
"ImportNode{ModuleName: ./utils.js, ModuleItem: , ModuleAlias: utils, WildcardImport: false}",
"ImportNode{ModuleName: ../utils/sideeffects.js, ModuleItem: , ModuleAlias: sideffects, WildcardImport: false}",
"ImportNode{ModuleName: ./data2.json, ModuleItem: , ModuleAlias: jsonData2, WildcardImport: false}",
"ImportNode{ModuleName: virtual-dom, ModuleItem: patch, ModuleAlias: patch, WildcardImport: false}",
"ImportNode{ModuleName: @xyz/pqr, ModuleItem: foo, ModuleAlias: fooAlias, WildcardImport: false}",
"ImportNode{ModuleName: @xyz/pqr, ModuleItem: bar, ModuleAlias: bar, WildcardImport: false}",
"ImportNode{ModuleName: @xyz/mno, ModuleItem: baz2, ModuleAlias: baz2Alias, WildcardImport: false}",
"ImportNode{ModuleName: @xyz/mno, ModuleItem: baz, ModuleAlias: baz, WildcardImport: false}",
"ImportNode{ModuleName: @xyz/abc, ModuleItem: , ModuleAlias: a, WildcardImport: false}",
"ImportNode{ModuleName: @xyz/xyz, ModuleItem: , ModuleAlias: b, WildcardImport: false}",
"ImportNode{ModuleName: @xyz/pqr, ModuleItem: , ModuleAlias: c, WildcardImport: false}",
"ImportNode{ModuleName: @xyz/mno, ModuleItem: baz, ModuleAlias: bazAlias, WildcardImport: false}",
"ImportNode{ModuleName: @xyz/mno, ModuleItem: d, ModuleAlias: d, WildcardImport: false}",
},
},
}
func TestJavascriptLanguageResolvers(t *testing.T) {
t.Run("ResolversExists", func(t *testing.T) {
l, err := lang.NewJavascriptLanguage()
assert.NoError(t, err)
resolvers := l.Resolvers()
assert.NotNil(t, resolvers)
})
t.Run("ResolveImports", func(t *testing.T) {
l, err := lang.NewJavascriptLanguage()
assert.NoError(t, err)
importExpectationsMapper := make(map[string][]string)
importFilePaths := []string{}
for _, ie := range javascriptImportExpectations {
importFilePaths = append(importFilePaths, ie.filePath)
importExpectationsMapper[ie.filePath] = ie.imports
}
javascriptLanguage, err := lang.NewJavascriptLanguage()
assert.NoError(t, err)
fileParser, err := parser.NewParser([]core.Language{javascriptLanguage})
assert.NoError(t, err)
fileSystem, err := fs.NewLocalFileSystem(fs.LocalFileSystemConfig{
AppDirectories: importFilePaths,
})
assert.NoError(t, err)
err = fileSystem.EnumerateApp(context.Background(), func(f core.File) error {
parseTree, err := fileParser.Parse(context.Background(), f)
assert.NoError(t, err)
imports, err := l.Resolvers().ResolveImports(parseTree)
assert.NoError(t, err)
expectedImports, ok := importExpectationsMapper[f.Name()]
assert.True(t, ok)
assert.Equal(t, len(expectedImports), len(imports))
for i, expectedImport := range expectedImports {
assert.Equal(t, expectedImport, imports[i].String())
}
return err
})
assert.NoError(t, err)
})
}