aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/cli/internal/context/context_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'cli/internal/context/context_test.go')
-rw-r--r--cli/internal/context/context_test.go162
1 files changed, 162 insertions, 0 deletions
diff --git a/cli/internal/context/context_test.go b/cli/internal/context/context_test.go
new file mode 100644
index 0000000..692c0a8
--- /dev/null
+++ b/cli/internal/context/context_test.go
@@ -0,0 +1,162 @@
+package context
+
+import (
+ "os"
+ "path/filepath"
+ "regexp"
+ "testing"
+
+ testifyAssert "github.com/stretchr/testify/assert"
+ "github.com/vercel/turbo/cli/internal/fs"
+ "github.com/vercel/turbo/cli/internal/turbopath"
+)
+
+func Test_isWorkspaceReference(t *testing.T) {
+ rootpath, err := filepath.Abs(filepath.FromSlash("/some/repo"))
+ if err != nil {
+ t.Fatalf("failed to create absolute root path %v", err)
+ }
+ pkgDir, err := filepath.Abs(filepath.FromSlash("/some/repo/packages/libA"))
+ if err != nil {
+ t.Fatalf("failed to create absolute pkgDir %v", err)
+ }
+ tests := []struct {
+ name string
+ packageVersion string
+ dependencyVersion string
+ want bool
+ }{
+ {
+ name: "handles exact match",
+ packageVersion: "1.2.3",
+ dependencyVersion: "1.2.3",
+ want: true,
+ },
+ {
+ name: "handles semver range satisfied",
+ packageVersion: "1.2.3",
+ dependencyVersion: "^1.0.0",
+ want: true,
+ },
+ {
+ name: "handles semver range not-satisfied",
+ packageVersion: "2.3.4",
+ dependencyVersion: "^1.0.0",
+ want: false,
+ },
+ {
+ name: "handles workspace protocol with version",
+ packageVersion: "1.2.3",
+ dependencyVersion: "workspace:1.2.3",
+ want: true,
+ },
+ {
+ name: "handles workspace protocol with relative path",
+ packageVersion: "1.2.3",
+ dependencyVersion: "workspace:../other-package/",
+ want: true,
+ },
+ {
+ name: "handles npm protocol with satisfied semver range",
+ packageVersion: "1.2.3",
+ dependencyVersion: "npm:^1.2.3",
+ want: true, // default in yarn is to use the workspace version unless `enableTransparentWorkspaces: true`. This isn't currently being checked.
+ },
+ {
+ name: "handles npm protocol with non-satisfied semver range",
+ packageVersion: "2.3.4",
+ dependencyVersion: "npm:^1.2.3",
+ want: false,
+ },
+ {
+ name: "handles pre-release versions",
+ packageVersion: "1.2.3",
+ dependencyVersion: "1.2.2-alpha-1234abcd.0",
+ want: false,
+ },
+ {
+ name: "handles non-semver package version",
+ packageVersion: "sometag",
+ dependencyVersion: "1.2.3",
+ want: true, // for backwards compatability with the code before versions were verified
+ },
+ {
+ name: "handles non-semver package version",
+ packageVersion: "1.2.3",
+ dependencyVersion: "sometag",
+ want: true, // for backwards compatability with the code before versions were verified
+ },
+ {
+ name: "handles file:... inside repo",
+ packageVersion: "1.2.3",
+ dependencyVersion: "file:../libB",
+ want: true, // this is a sibling package
+ },
+ {
+ name: "handles file:... outside repo",
+ packageVersion: "1.2.3",
+ dependencyVersion: "file:../../../otherproject",
+ want: false, // this is not within the repo root
+ },
+ {
+ name: "handles link:... inside repo",
+ packageVersion: "1.2.3",
+ dependencyVersion: "link:../libB",
+ want: true, // this is a sibling package
+ },
+ {
+ name: "handles link:... outside repo",
+ packageVersion: "1.2.3",
+ dependencyVersion: "link:../../../otherproject",
+ want: false, // this is not within the repo root
+ },
+ {
+ name: "handles development versions",
+ packageVersion: "0.0.0-development",
+ dependencyVersion: "*",
+ want: true, // "*" should always match
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ got := isWorkspaceReference(tt.packageVersion, tt.dependencyVersion, pkgDir, rootpath)
+ if got != tt.want {
+ t.Errorf("isWorkspaceReference(%v, %v, %v, %v) got = %v, want %v", tt.packageVersion, tt.dependencyVersion, pkgDir, rootpath, got, tt.want)
+ }
+ })
+ }
+}
+
+func TestBuildPackageGraph_DuplicateNames(t *testing.T) {
+ path := getTestDir(t, "dupe-workspace-names")
+ pkgJSON := &fs.PackageJSON{
+ Name: "dupe-workspace-names",
+ PackageManager: "pnpm@7.15.0",
+ }
+
+ _, actualErr := BuildPackageGraph(path, pkgJSON)
+
+ // Not asserting the full error message, because it includes a path with slashes and backslashes
+ // getting the regex incantation to check that is not worth it.
+ // We have to use regex because the actual error may be different depending on which workspace was
+ // added first and which one was second, causing the error.
+ testifyAssert.Regexp(t, regexp.MustCompile("^Failed to add workspace \"same-name\".+$"), actualErr)
+}
+
+// This is duplicated from fs.turbo_json_test.go.
+// I wasn't able to pull it into a helper file/package because
+// it requires the `fs` package and it would cause cyclical dependencies
+// when used in turbo_json_test.go and would require more changes to fix that.
+func getTestDir(t *testing.T, testName string) turbopath.AbsoluteSystemPath {
+ defaultCwd, err := os.Getwd()
+ if err != nil {
+ t.Errorf("failed to get cwd: %v", err)
+ }
+ cwd, err := fs.CheckedToAbsoluteSystemPath(defaultCwd)
+ if err != nil {
+ t.Fatalf("cwd is not an absolute directory %v: %v", defaultCwd, err)
+ }
+
+ return cwd.UntypedJoin("testdata", testName)
+}