cla_test.gno

package cla

import (
	"testing"

	"gno.land/p/moul/addrset"
	"gno.land/p/nt/uassert/v0"
)

const (
	testHash1 = "abc123def456"
	testHash2 = "xyz789uvw012"
	testUser1 = "g1user1address1234567890"
	testUser2 = "g1user2address0987654321"
)

func resetState() {
	signatures = addrset.Set{}
	requiredHash = ""
	claURL = ""
}

func TestSign(t *testing.T) {
	resetState()

	setRequiredHash(testHash1)

	testing.SetRealm(testing.NewUserRealm(testUser1))
	Sign(cross, testHash1)

	uassert.True(t, HasValidSignature(address(testUser1)))
}

func TestSign_WrongHash(t *testing.T) {
	resetState()

	setRequiredHash(testHash1)

	testing.SetRealm(testing.NewUserRealm(testUser1))
	uassert.AbortsWithMessage(t, "hash does not match required CLA hash", func() {
		Sign(cross, testHash2)
	})

	uassert.False(t, HasValidSignature(address(testUser1)))
}

func TestHasValidSignature_Disabled(t *testing.T) {
	resetState()

	uassert.Equal(t, "", requiredHash)
	uassert.True(t, HasValidSignature(address(testUser1)))
	uassert.True(t, HasValidSignature(address(testUser2)))
}

func TestHasValidSignature_Valid(t *testing.T) {
	resetState()

	setRequiredHash(testHash1)

	testing.SetRealm(testing.NewUserRealm(testUser1))
	Sign(cross, testHash1)

	uassert.True(t, HasValidSignature(address(testUser1)))
}

func TestHasValidSignature_NotSigned(t *testing.T) {
	resetState()

	setRequiredHash(testHash1)

	uassert.False(t, HasValidSignature(address(testUser1)))
}

func TestSetRequiredHash_ResetsSignatures(t *testing.T) {
	resetState()

	setRequiredHash(testHash1)

	testing.SetRealm(testing.NewUserRealm(testUser1))
	Sign(cross, testHash1)
	uassert.True(t, HasValidSignature(address(testUser1)))
	uassert.Equal(t, 1, signatures.Size())

	// Update hash - should reset signatures
	setRequiredHash(testHash2)

	uassert.False(t, HasValidSignature(address(testUser1)))
	uassert.Equal(t, 0, signatures.Size())
}