pkgrelease_test.gno
4.48 Kb · 127 lines
1package forge
2
3import (
4 "testing"
5
6 "gno.land/p/nt/uassert/v0"
7)
8
9// The path an explorer walks: it arrives holding a deployed package path, knows
10// no repo, and needs the issues and releases that belong to it.
11func TestPackageLookupFromAPathAlone(cur realm, t *testing.T) {
12 reset()
13
14 testing.SetRealm(testing.NewUserRealm(alice))
15 CreateRepo(cross(cur), demoID, "a demo repo", "")
16
17 uassert.Equal(t, "", PackageRepo("gno.land/r/moul/home"), "nobody claims it yet")
18 uassert.Equal(t, 0, PackageCount())
19
20 testing.SetRealm(testing.NewUserRealm(alice))
21 PublishPackage(cross(cur), demoID, "gno.land/r/moul/home", "refs/heads/main", oid("a"), "")
22
23 uassert.Equal(t, demoID, PackageRepo("gno.land/r/moul/home"))
24 uassert.Equal(t, 1, PackageCount())
25
26 // One repo publishes many paths, which is the normal case: gno-contracts
27 // publishes 193.
28 testing.SetRealm(testing.NewUserRealm(alice))
29 PublishPackage(cross(cur), demoID, "gno.land/p/moul/forge/v1", "", "", "")
30 uassert.Equal(t, 2, PackageCount())
31 uassert.Equal(t, demoID, PackageRepo("gno.land/p/moul/forge/v1"))
32
33 testing.SetRealm(testing.NewUserRealm(alice))
34 UnpublishPackage(cross(cur), demoID, "gno.land/r/moul/home")
35 uassert.Equal(t, "", PackageRepo("gno.land/r/moul/home"))
36 uassert.Equal(t, 1, PackageCount())
37}
38
39// Capturing another project's package path in every explorer that reads this
40// index has to be impossible, not merely discouraged.
41func TestPublishCannotCaptureAnotherReposPath(cur realm, t *testing.T) {
42 reset()
43
44 testing.SetRealm(testing.NewUserRealm(alice))
45 CreateRepo(cross(cur), demoID, "", "")
46 PublishPackage(cross(cur), demoID, "gno.land/r/moul/home", "", "", "")
47
48 squatID := eve.String() + "/squat"
49 testing.SetRealm(testing.NewUserRealm(eve))
50 CreateRepo(cross(cur), squatID, "", "")
51 testing.SetRealm(testing.NewUserRealm(eve))
52 uassert.AbortsContains(t, cur, "claimed by another repo", func() {
53 PublishPackage(cross(cur), squatID, "gno.land/r/moul/home", "", "", "")
54 })
55 uassert.Equal(t, demoID, PackageRepo("gno.land/r/moul/home"))
56}
57
58func TestPublishNeedsWriteAccess(cur realm, t *testing.T) {
59 reset()
60
61 testing.SetRealm(testing.NewUserRealm(alice))
62 CreateRepo(cross(cur), demoID, "", "")
63
64 testing.SetRealm(testing.NewUserRealm(eve))
65 uassert.AbortsContains(t, cur, "unauthorized", func() {
66 PublishPackage(cross(cur), demoID, "gno.land/r/moul/home", "", "", "")
67 })
68}
69
70func TestReleaseLifecycle(cur realm, t *testing.T) {
71 reset()
72
73 testing.SetRealm(testing.NewUserRealm(alice))
74 CreateRepo(cross(cur), demoID, "", "")
75
76 uassert.Equal(t, 0, ReleaseCount(demoID))
77 uassert.Equal(t, "", LatestReleaseTag(demoID))
78
79 testing.SetRealm(testing.NewUserRealm(alice))
80 CutRelease(cross(cur), demoID, "v1.0.0", "First", "it works", oid("a"), "", false)
81 uassert.Equal(t, 1, ReleaseCount(demoID))
82 uassert.Equal(t, "v1.0.0", LatestReleaseTag(demoID))
83
84 // A prerelease is cut later and is still not the latest.
85 testing.SetRealm(testing.NewUserRealm(alice))
86 CutRelease(cross(cur), demoID, "v2.0.0-rc.1", "", "", "", "", true)
87 uassert.Equal(t, "v1.0.0", LatestReleaseTag(demoID))
88
89 // A tag never moves.
90 testing.SetRealm(testing.NewUserRealm(alice))
91 uassert.AbortsContains(t, cur, "release already exists", func() {
92 CutRelease(cross(cur), demoID, "v1.0.0", "Again", "", oid("b"), "", false)
93 })
94
95 // Yanking withdraws it without deleting it: a version that vanished reads
96 // as never published rather than as do-not-use.
97 testing.SetRealm(testing.NewUserRealm(alice))
98 CutRelease(cross(cur), demoID, "v2.0.0", "", "", "", "", false)
99 uassert.Equal(t, "v2.0.0", LatestReleaseTag(demoID))
100 testing.SetRealm(testing.NewUserRealm(alice))
101 YankRelease(cross(cur), demoID, "v2.0.0", "broken migration")
102 uassert.Equal(t, "v1.0.0", LatestReleaseTag(demoID))
103 uassert.Equal(t, 3, ReleaseCount(demoID), "a yank keeps the release")
104}
105
106func TestReleaseNeedsWriteAccess(cur realm, t *testing.T) {
107 reset()
108
109 testing.SetRealm(testing.NewUserRealm(alice))
110 CreateRepo(cross(cur), demoID, "", "")
111
112 testing.SetRealm(testing.NewUserRealm(eve))
113 uassert.AbortsContains(t, cur, "unauthorized", func() {
114 CutRelease(cross(cur), demoID, "v1.0.0", "", "", "", "", false)
115 })
116}
117
118// A read against a repo that does not exist answers emptily rather than
119// aborting: vm/qeval is how an explorer asks, and a panic there is a 500 the
120// caller cannot tell from a broken node.
121func TestReadsOnAnUnknownRepoAreEmpty(t *testing.T) {
122 reset()
123
124 uassert.Equal(t, "", PackageRepo("gno.land/r/nobody/nothing"))
125 uassert.Equal(t, 0, ReleaseCount("nobody/nothing"))
126 uassert.Equal(t, "", LatestReleaseTag("nobody/nothing"))
127}