Skip to content Search Apps Documentation Source Content File Folder Download Copy Actions State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

Community realm. Read the code first. Community realm, deployed by its author. Read the code before you interact or send coins.

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}