199 lines
4.6 KiB
Go
199 lines
4.6 KiB
Go
// SPDX-License-Identifier: EUPL-1.2
|
|
|
|
package manifest
|
|
|
|
import (
|
|
"crypto/ed25519"
|
|
"crypto/rand"
|
|
json "dappco.re/go/core/scm/internal/ax/jsonx"
|
|
"testing"
|
|
|
|
"dappco.re/go/core/io"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestCompile_Good(t *testing.T) {
|
|
m := &Manifest{
|
|
Code: "my-widget",
|
|
Name: "My Widget",
|
|
Version: "1.2.3",
|
|
Author: "tester",
|
|
}
|
|
|
|
cm, err := Compile(m, CompileOptions{
|
|
Version: "2.0.0",
|
|
Commit: "abc1234",
|
|
Tag: "v1.2.3",
|
|
BuiltBy: "core build",
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, "my-widget", cm.Code)
|
|
assert.Equal(t, "My Widget", cm.Name)
|
|
assert.Equal(t, "2.0.0", cm.Version)
|
|
assert.Equal(t, "abc1234", cm.Commit)
|
|
assert.Equal(t, "v1.2.3", cm.Tag)
|
|
assert.Equal(t, "core build", cm.BuiltBy)
|
|
assert.NotEmpty(t, cm.BuiltAt)
|
|
}
|
|
|
|
func TestCompile_Good_WithSigning_Good(t *testing.T) {
|
|
pub, priv, err := ed25519.GenerateKey(rand.Reader)
|
|
require.NoError(t, err)
|
|
|
|
m := &Manifest{
|
|
Code: "signed-mod",
|
|
Name: "Signed Module",
|
|
Version: "0.1.0",
|
|
}
|
|
|
|
cm, err := Compile(m, CompileOptions{
|
|
Commit: "def5678",
|
|
SignKey: priv,
|
|
})
|
|
require.NoError(t, err)
|
|
assert.NotEmpty(t, cm.Sign)
|
|
|
|
// Verify signature is valid.
|
|
ok, vErr := Verify(&cm.Manifest, pub)
|
|
require.NoError(t, vErr)
|
|
assert.True(t, ok)
|
|
}
|
|
|
|
func TestCompile_Bad_NilManifest_Good(t *testing.T) {
|
|
_, err := Compile(nil, CompileOptions{})
|
|
assert.Error(t, err)
|
|
assert.Contains(t, err.Error(), "nil manifest")
|
|
}
|
|
|
|
func TestCompile_Bad_MissingCode_Good(t *testing.T) {
|
|
m := &Manifest{Version: "1.0.0"}
|
|
_, err := Compile(m, CompileOptions{})
|
|
assert.Error(t, err)
|
|
assert.Contains(t, err.Error(), "missing code")
|
|
}
|
|
|
|
func TestCompile_Bad_MissingVersion_Good(t *testing.T) {
|
|
m := &Manifest{Code: "test"}
|
|
_, err := Compile(m, CompileOptions{})
|
|
assert.Error(t, err)
|
|
assert.Contains(t, err.Error(), "missing version")
|
|
}
|
|
|
|
func TestMarshalJSON_Good(t *testing.T) {
|
|
cm := &CompiledManifest{
|
|
Manifest: Manifest{
|
|
Code: "test-mod",
|
|
Name: "Test Module",
|
|
Version: "1.0.0",
|
|
},
|
|
Commit: "abc123",
|
|
Tag: "v1.0.0",
|
|
BuiltAt: "2026-03-15T10:00:00Z",
|
|
BuiltBy: "test",
|
|
}
|
|
|
|
data, err := MarshalJSON(cm)
|
|
require.NoError(t, err)
|
|
|
|
// Round-trip: parse back.
|
|
parsed, err := ParseCompiled(data)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "test-mod", parsed.Code)
|
|
assert.Equal(t, "abc123", parsed.Commit)
|
|
assert.Equal(t, "v1.0.0", parsed.Tag)
|
|
assert.Equal(t, "2026-03-15T10:00:00Z", parsed.BuiltAt)
|
|
}
|
|
|
|
func TestParseCompiled_Good(t *testing.T) {
|
|
raw := `{
|
|
"code": "demo",
|
|
"name": "Demo",
|
|
"version": "0.5.0",
|
|
"commit": "aaa111",
|
|
"tag": "v0.5.0",
|
|
"built_at": "2026-03-15T12:00:00Z",
|
|
"built_by": "ci"
|
|
}`
|
|
cm, err := ParseCompiled([]byte(raw))
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "demo", cm.Code)
|
|
assert.Equal(t, "aaa111", cm.Commit)
|
|
assert.Equal(t, "ci", cm.BuiltBy)
|
|
}
|
|
|
|
func TestParseCompiled_Bad(t *testing.T) {
|
|
_, err := ParseCompiled([]byte("not json"))
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func TestWriteCompiled_Good(t *testing.T) {
|
|
medium := io.NewMockMedium()
|
|
cm := &CompiledManifest{
|
|
Manifest: Manifest{
|
|
Code: "write-test",
|
|
Name: "Write Test",
|
|
Version: "1.0.0",
|
|
},
|
|
Commit: "ccc333",
|
|
}
|
|
|
|
err := WriteCompiled(medium, "/project", cm)
|
|
require.NoError(t, err)
|
|
|
|
// Verify the file was written.
|
|
content, err := medium.Read("/project/core.json")
|
|
require.NoError(t, err)
|
|
|
|
var parsed CompiledManifest
|
|
require.NoError(t, json.Unmarshal([]byte(content), &parsed))
|
|
assert.Equal(t, "write-test", parsed.Code)
|
|
assert.Equal(t, "ccc333", parsed.Commit)
|
|
}
|
|
|
|
func TestLoadCompiled_Good(t *testing.T) {
|
|
medium := io.NewMockMedium()
|
|
raw := `{"code":"load-test","name":"Load Test","version":"2.0.0","commit":"ddd444"}`
|
|
medium.Files["/project/core.json"] = raw
|
|
|
|
cm, err := LoadCompiled(medium, "/project")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "load-test", cm.Code)
|
|
assert.Equal(t, "ddd444", cm.Commit)
|
|
}
|
|
|
|
func TestLoadCompiled_Bad_NotFound_Good(t *testing.T) {
|
|
medium := io.NewMockMedium()
|
|
_, err := LoadCompiled(medium, "/missing")
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func TestCompile_Good_MinimalOptions_Good(t *testing.T) {
|
|
m := &Manifest{
|
|
Code: "minimal",
|
|
Name: "Minimal",
|
|
Version: "0.0.1",
|
|
}
|
|
cm, err := Compile(m, CompileOptions{})
|
|
require.NoError(t, err)
|
|
assert.Empty(t, cm.Commit)
|
|
assert.Empty(t, cm.Tag)
|
|
assert.Empty(t, cm.BuiltBy)
|
|
assert.NotEmpty(t, cm.BuiltAt)
|
|
}
|
|
|
|
func TestCompile_Good_WithVersionOverride_Good(t *testing.T) {
|
|
m := &Manifest{
|
|
Code: "override",
|
|
Name: "Override",
|
|
Version: "0.0.1",
|
|
}
|
|
|
|
cm, err := Compile(m, CompileOptions{
|
|
Version: "9.9.9",
|
|
})
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "9.9.9", cm.Version)
|
|
assert.Equal(t, "9.9.9", m.Version)
|
|
}
|