PathrockNetwork Gno Explorer
HomeBlocksTransactionsTokensRealmsPackagesValidatorsAnalytics

PathrockNetwork Gno Explorer — an independent explorer for Gno.land Mainnet (gnoland-1), operated by PathrockNetwork. Not an official Gno.land service.

gnowebarchive RPC

gno.land/p/moul/forge/v1

Package
Open in gnoweb ↗

Overview

Kind
Pure package
Name
v1
Namespace
moul / forge
Files
18 (README)(gnomod.toml)
Exported functions
n/a — not supported for pure packages by the node (vm/qfuncs)
Module
gno.land/p/moul/forge/v1
gno
0.9

Files (18)

  • README.mdmarkdown
  • gnomod.tomltoml
  • change.gnogno
  • errors.gnogno
  • forge.gnogno
  • issue.gnogno
  • pkg.gnogno
  • ref.gnogno
  • release.gnogno
  • validate.gnogno
  • change_test.gnogno
  • forge_test.gnogno
  • helpers_test.gnogno
  • issue_test.gnogno
  • pkg_test.gnogno
  • ref_test.gnogno
  • release_test.gnogno
  • validate_test.gnogno
  • release_test.gnogno
    1package forge23import (4	"testing"56	"gno.land/p/nt/uassert/v0"7	"gno.land/p/nt/urequire/v0"8

    Functions

    not supported for pure packages by the node (vm/qfuncs)

    Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.

    )
    9
    10func TestValidTag(t *testing.T) {
    11 cases := []struct {
    12 name string
    13 tag string
    14 want bool
    15 }{
    16 {"semver", "v1.2.0", true},
    17 // gno.land's own packages are v0 and v1 with no minor or patch. A tag
    18 // rule that refused those would refuse the ecosystem it serves.
    19 {"a gno version", "v0", true},
    20 {"a prerelease", "v1.0.0-rc.1", true},
    21 {"build metadata", "v1.0.0+build.5", true},
    22 {"not version shaped at all", "genesis-snapshot", true},
    23 {"empty", "", false},
    24 {"a slash", "release/v1", false},
    25 {"a traversal", "v1..0", false},
    26 {"a space", "v1 0", false},
    27 }
    28 for _, tc := range cases {
    29 t.Run(tc.name, func(t *testing.T) {
    30 uassert.Equal(t, tc.want, ValidTag(tc.tag))
    31 })
    32 }
    33}
    34
    35func TestCutRelease(t *testing.T) {
    36 _, r := newRepo(t)
    37
    38 rel, err := r.CutRelease(carol, 300, "v1.0.0", "First", "it works", oid("a"), "refs/tags/v1.0.0", false)
    39 urequire.NoError(t, err)
    40 uassert.Equal(t, "v1.0.0", rel.Tag)
    41 uassert.Equal(t, "First", rel.Name)
    42 uassert.Equal(t, int64(300), rel.CreatedAt)
    43 uassert.False(t, rel.Prerelease)
    44 uassert.Equal(t, 1, r.ReleaseCount())
    45
    46 got := r.Release("v1.0.0")
    47 urequire.True(t, got != nil)
    48 uassert.Equal(t, "it works", got.Notes)
    49 uassert.True(t, r.Release("v9.9.9") == nil)
    50}
    51
    52// A consumer who pinned v1.2.0 and later got different bytes has been lied to.
    53// The whole point of a tag is that it does not move.
    54func TestCutReleaseIsImmutable(t *testing.T) {
    55 _, r := newRepo(t)
    56
    57 _, err := r.CutRelease(alice, 300, "v1.0.0", "First", "", oid("a"), "", false)
    58 urequire.NoError(t, err)
    59 _, err = r.CutRelease(alice, 400, "v1.0.0", "Second", "", oid("b"), "", false)
    60 uassert.ErrorIs(t, err, ErrReleaseExists)
    61 uassert.Equal(t, oid("a"), r.Release("v1.0.0").OID)
    62}
    63
    64// Cut order, never tag order: a lexical sort presents v10 before v2 and calls
    65// it newest, and there is no semver to sort by because the tags are not
    66// required to be semver.
    67func TestIterateReleasesIsCutOrderNotTagOrder(t *testing.T) {
    68 _, r := newRepo(t)
    69
    70 for i, tag := range []string{"v2.0.0", "v10.0.0", "v3.0.0"} {
    71 _, err := r.CutRelease(alice, int64(300+i), tag, "", "", "", "", false)
    72 urequire.NoError(t, err)
    73 }
    74
    75 var seen []string
    76 r.IterateReleases(0, 0, func(rel *Release) bool {
    77 seen = append(seen, rel.Tag)
    78 return false
    79 })
    80 urequire.Equal(t, 3, len(seen))
    81 uassert.Equal(t, "v3.0.0", seen[0])
    82 uassert.Equal(t, "v10.0.0", seen[1])
    83 uassert.Equal(t, "v2.0.0", seen[2])
    84}
    85
    86func TestLatestReleaseSkipsPrereleaseAndYanked(t *testing.T) {
    87 _, r := newRepo(t)
    88
    89 _, err := r.CutRelease(alice, 300, "v1.0.0", "", "", "", "", false)
    90 urequire.NoError(t, err)
    91 uassert.Equal(t, "v1.0.0", r.LatestRelease().Tag)
    92
    93 // A prerelease is cut later and is still not the latest.
    94 _, err = r.CutRelease(alice, 310, "v2.0.0-rc.1", "", "", "", "", true)
    95 urequire.NoError(t, err)
    96 uassert.Equal(t, "v1.0.0", r.LatestRelease().Tag)
    97
    98 _, err = r.CutRelease(alice, 320, "v2.0.0", "", "", "", "", false)
    99 urequire.NoError(t, err)
    100 uassert.Equal(t, "v2.0.0", r.LatestRelease().Tag)
    101
    102 // Yanking moves it back, and does not delete it.
    103 urequire.NoError(t, r.YankRelease(alice, "v2.0.0", "broken migration"))
    104 uassert.Equal(t, "v1.0.0", r.LatestRelease().Tag)
    105 uassert.Equal(t, 3, r.ReleaseCount())
    106 yanked := r.Release("v2.0.0")
    107 urequire.True(t, yanked != nil)
    108 uassert.True(t, yanked.Yanked)
    109 uassert.Equal(t, "broken migration", yanked.YankReason)
    110}
    111
    112func TestLatestReleaseIsNilWhenThereIsNone(t *testing.T) {
    113 _, r := newRepo(t)
    114 uassert.True(t, r.LatestRelease() == nil)
    115
    116 _, err := r.CutRelease(alice, 300, "v1.0.0-rc.1", "", "", "", "", true)
    117 urequire.NoError(t, err)
    118 uassert.True(t, r.LatestRelease() == nil)
    119}
    120
    121func TestReleaseAuthorityAndValidation(t *testing.T) {
    122 _, r := newRepo(t)
    123
    124 _, err := r.CutRelease(dave, 300, "v1.0.0", "", "", "", "", false)
    125 uassert.ErrorIs(t, err, ErrUnauthorized)
    126 _, err = r.CutRelease(eve, 300, "v1.0.0", "", "", "", "", false)
    127 uassert.ErrorIs(t, err, ErrUnauthorized)
    128
    129 _, err = r.CutRelease(alice, 300, "release/v1", "", "", "", "", false)
    130 uassert.ErrorIs(t, err, ErrInvalidTag)
    131
    132 _, err = r.CutRelease(alice, 300, "v1.0.0", "", "", "nothex", "", false)
    133 uassert.ErrorIs(t, err, ErrInvalidOID)
    134
    135 _, err = r.CutRelease(alice, 300, "v1.0.0", "", "", "", "v1.0.0", false)
    136 uassert.ErrorIs(t, err, ErrInvalidRefName)
    137
    138 uassert.ErrorIs(t, r.YankRelease(dave, "v1.0.0", ""), ErrUnauthorized)
    139 uassert.ErrorIs(t, r.YankRelease(alice, "v9.9.9", ""), ErrReleaseNotFound)
    140
    141 urequire.NoError(t, r.SetArchived(alice, true))
    142 _, err = r.CutRelease(alice, 300, "v1.0.0", "", "", "", "", false)
    143 uassert.ErrorIs(t, err, ErrRepoArchived)
    144}
    145
    146func TestForkInheritsNoReleases(t *testing.T) {
    147 f, r := newRepo(t)
    148 _, err := r.CutRelease(alice, 300, "v1.0.0", "", "", "", "", false)
    149 urequire.NoError(t, err)
    150
    151 child, err := f.Fork(eve, 310, r.ID, "eve/forge")
    152 urequire.NoError(t, err)
    153 uassert.Equal(t, 0, child.ReleaseCount())
    154 uassert.True(t, child.LatestRelease() == nil)
    155}
    156