Skip to content

Commit 6746296

Browse files
authored
[update] Add simple unit test for lockfile merge logic (#1309)
## Summary I'm sorry if this steps a bit on your toes :( . I just figured I wanted some unit test before I made the changes to the merging logic, and noticed that if I just refactored a function a little bit, then we could add some unit tests easily at the function level. I just added 1 unit test here to demonstrate, and will add more later as I implement the bugfix. ## How was it tested? Unit tests
1 parent 26d533d commit 6746296

File tree

3 files changed

+69
-39
lines changed

3 files changed

+69
-39
lines changed

internal/impl/devbox_test.go

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,7 @@ func (n *testNix) PrintDevEnv(ctx context.Context, args *nix.PrintDevEnvArgs) (*
6767
}
6868

6969
func TestComputeNixEnv(t *testing.T) {
70-
path := t.TempDir()
71-
_, err := devconfig.Init(path, os.Stdout)
72-
require.NoError(t, err, "InitConfig should not fail")
73-
d, err := Open(&devopt.Opts{
74-
Dir: path,
75-
Writer: os.Stdout,
76-
Pure: false,
77-
})
78-
require.NoError(t, err, "Open should not fail")
70+
d := devboxForTesting(t)
7971
d.nix = &testNix{}
8072
ctx := context.Background()
8173
env, err := d.computeNixEnv(ctx, false /*use cache*/)
@@ -84,15 +76,7 @@ func TestComputeNixEnv(t *testing.T) {
8476
}
8577

8678
func TestComputeNixPathIsIdempotent(t *testing.T) {
87-
dir := t.TempDir()
88-
_, err := devconfig.Init(dir, os.Stdout)
89-
require.NoError(t, err, "InitConfig should not fail")
90-
devbox, err := Open(&devopt.Opts{
91-
Dir: dir,
92-
Writer: os.Stdout,
93-
Pure: false,
94-
})
95-
require.NoError(t, err, "Open should not fail")
79+
devbox := devboxForTesting(t)
9680
devbox.nix = &testNix{"/tmp/my/path"}
9781
ctx := context.Background()
9882
env, err := devbox.computeNixEnv(ctx, false /*use cache*/)
@@ -114,15 +98,7 @@ func TestComputeNixPathIsIdempotent(t *testing.T) {
11498
}
11599

116100
func TestComputeNixPathWhenRemoving(t *testing.T) {
117-
dir := t.TempDir()
118-
_, err := devconfig.Init(dir, os.Stdout)
119-
require.NoError(t, err, "InitConfig should not fail")
120-
devbox, err := Open(&devopt.Opts{
121-
Dir: dir,
122-
Writer: os.Stdout,
123-
Pure: false,
124-
})
125-
require.NoError(t, err, "Open should not fail")
101+
devbox := devboxForTesting(t)
126102
devbox.nix = &testNix{"/tmp/my/path"}
127103
ctx := context.Background()
128104
env, err := devbox.computeNixEnv(ctx, false /*use cache*/)
@@ -145,3 +121,17 @@ func TestComputeNixPathWhenRemoving(t *testing.T) {
145121

146122
assert.NotEqual(t, path, path2, "path should not be the same")
147123
}
124+
125+
func devboxForTesting(t *testing.T) *Devbox {
126+
path := t.TempDir()
127+
_, err := devconfig.Init(path, os.Stdout)
128+
require.NoError(t, err, "InitConfig should not fail")
129+
d, err := Open(&devopt.Opts{
130+
Dir: path,
131+
Writer: os.Stdout,
132+
Pure: false,
133+
})
134+
require.NoError(t, err, "Open should not fail")
135+
136+
return d
137+
}

internal/impl/update.go

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -89,25 +89,35 @@ func (d *Devbox) updateDevboxPackage(
8989
ctx context.Context,
9090
pkg *devpkg.Package,
9191
) error {
92-
existing := d.lockfile.Packages[pkg.Raw]
93-
newEntry, err := d.lockfile.FetchResolvedPackage(pkg.Raw)
92+
resolved, err := d.lockfile.FetchResolvedPackage(pkg.Raw)
9493
if err != nil {
9594
return err
9695
}
96+
97+
return d.mergeResolvedPackageToLockfile(ctx, pkg, resolved, d.lockfile)
98+
}
99+
100+
func (d *Devbox) mergeResolvedPackageToLockfile(
101+
ctx context.Context,
102+
pkg *devpkg.Package,
103+
resolved *lock.Package,
104+
lockfile *lock.File,
105+
) error {
106+
existing := lockfile.Packages[pkg.Raw]
97107
if existing == nil {
98-
ux.Finfo(d.writer, "Resolved %s to %[1]s %[2]s\n", pkg, newEntry.Resolved)
99-
d.lockfile.Packages[pkg.Raw] = newEntry
108+
ux.Finfo(d.writer, "Resolved %s to %[1]s %[2]s\n", pkg, resolved.Resolved)
109+
lockfile.Packages[pkg.Raw] = resolved
100110
return nil
101111
}
102112

103-
if existing.Version != newEntry.Version {
104-
ux.Finfo(d.writer, "Updating %s %s -> %s\n", pkg, existing.Version, newEntry.Version)
113+
if existing.Version != resolved.Version {
114+
ux.Finfo(d.writer, "Updating %s %s -> %s\n", pkg, existing.Version, resolved.Version)
105115
if err := d.removePackagesFromProfile(ctx, []string{pkg.Raw}); err != nil {
106116
// Warn but continue. TODO(landau): ensurePackagesAreInstalled should
107117
// sync the profile so we don't need to do this manually.
108118
ux.Fwarning(d.writer, "Failed to remove %s from profile: %s\n", pkg, err)
109119
}
110-
d.lockfile.Packages[pkg.Raw] = newEntry
120+
lockfile.Packages[pkg.Raw] = resolved
111121
return nil
112122
}
113123

@@ -118,15 +128,15 @@ func (d *Devbox) updateDevboxPackage(
118128
return err
119129
}
120130

121-
// If the newEntry has a system info for the user's system, then add/overwrite it. We don't overwrite
131+
// If the resolved has a system info for the user's system, then add/overwrite it. We don't overwrite
122132
// other system infos because we don't want to clobber system-dependent CAStorePaths.
123-
if newSysInfo, ok := newEntry.Systems[userSystem]; ok {
133+
if newSysInfo, ok := resolved.Systems[userSystem]; ok {
124134
if !newSysInfo.Equals(existing.Systems[userSystem]) {
125135
// We only guard this so that the ux messaging is accurate. We could overwrite every time.
126-
if d.lockfile.Packages[pkg.Raw].Systems == nil {
127-
d.lockfile.Packages[pkg.Raw].Systems = map[string]*lock.SystemInfo{}
136+
if lockfile.Packages[pkg.Raw].Systems == nil {
137+
lockfile.Packages[pkg.Raw].Systems = map[string]*lock.SystemInfo{}
128138
}
129-
d.lockfile.Packages[pkg.Raw].Systems[userSystem] = newSysInfo
139+
lockfile.Packages[pkg.Raw].Systems[userSystem] = newSysInfo
130140
ux.Finfo(d.writer, "Updated system information for %s\n", pkg)
131141
return nil
132142
}

internal/impl/update_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package impl
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/stretchr/testify/require"
8+
"go.jetpack.io/devbox/internal/devpkg"
9+
"go.jetpack.io/devbox/internal/lock"
10+
)
11+
12+
func TestUpdateNewPackageIsAdded(t *testing.T) {
13+
devbox := devboxForTesting(t)
14+
15+
16+
devPkg := &devpkg.Package{
17+
Raw: raw,
18+
}
19+
resolved := &lock.Package{
20+
Resolved: "resolved-flake-reference",
21+
}
22+
lockfile := &lock.File{
23+
Packages: map[string]*lock.Package{}, // empty
24+
}
25+
26+
err := devbox.mergeResolvedPackageToLockfile(context.Background(), devPkg, resolved, lockfile)
27+
require.NoError(t, err, "update failed")
28+
29+
require.Contains(t, lockfile.Packages, raw)
30+
}

0 commit comments

Comments
 (0)