Some checks are pending
Docs Deploy / build_and_deploy (push) Waiting to run
Generate Docs / cli (push) Waiting to run
Generate Config Doc / cli (push) Waiting to run
Go formatting / go-formatting (push) Waiting to run
Check links / markdown-link-check (push) Waiting to run
Integration / pre-test (push) Waiting to run
Integration / test on (push) Blocked by required conditions
Integration / status (push) Blocked by required conditions
Lint / Lint Go code (push) Waiting to run
Test / test (ubuntu-latest) (push) Waiting to run
211 lines
4.6 KiB
Go
211 lines
4.6 KiB
Go
package scaffolder
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/ignite/cli/v29/ignite/pkg/multiformatname"
|
|
)
|
|
|
|
func TestCheckForbiddenComponentName(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
compName string
|
|
shouldError bool
|
|
}{
|
|
{
|
|
name: "should allow valid case",
|
|
compName: "valid",
|
|
shouldError: false,
|
|
},
|
|
{
|
|
name: "should prevent forbidden name",
|
|
compName: "genesis",
|
|
shouldError: true,
|
|
},
|
|
}
|
|
|
|
for _, tc := range tests {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
mfName, err := multiformatname.NewName(tc.compName)
|
|
require.NoError(t, err)
|
|
|
|
err = checkForbiddenComponentName(mfName)
|
|
if tc.shouldError {
|
|
require.Error(t, err)
|
|
return
|
|
}
|
|
require.NoError(t, err)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestCheckGoReservedWord(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
word string
|
|
shouldError bool
|
|
}{
|
|
{
|
|
name: "should allow valid case",
|
|
word: "valid",
|
|
shouldError: false,
|
|
},
|
|
{
|
|
name: "should prevent forbidden go identifier",
|
|
word: "panic",
|
|
shouldError: true,
|
|
},
|
|
{
|
|
name: "should prevent forbidden go keyword",
|
|
word: "for",
|
|
shouldError: true,
|
|
},
|
|
}
|
|
|
|
for _, tc := range tests {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
err := checkGoReservedWord(tc.word)
|
|
if tc.shouldError {
|
|
require.Error(t, err)
|
|
return
|
|
}
|
|
require.NoError(t, err)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestContainsCustomTypes(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
fields []string
|
|
contains bool
|
|
}{
|
|
{
|
|
name: "contains no custom types",
|
|
fields: []string{"foo", "bar"},
|
|
contains: false,
|
|
},
|
|
{
|
|
name: "contains one non-custom type",
|
|
fields: []string{"foo", "bar:coin"},
|
|
contains: false,
|
|
},
|
|
{
|
|
name: "contains one custom type",
|
|
fields: []string{"foo", "bar:CustomType"},
|
|
contains: true,
|
|
},
|
|
{
|
|
name: "contains one custom array type",
|
|
fields: []string{"foo", "bar:array.CustomType"},
|
|
contains: true,
|
|
},
|
|
{
|
|
name: "contains one built-in array type",
|
|
fields: []string{"foo", "bar:array.string"},
|
|
contains: false,
|
|
},
|
|
}
|
|
|
|
for _, tc := range tests {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
require.Equal(t, tc.contains, containsCustomTypes(tc.fields))
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestCheckTypeProtoCreated(t *testing.T) {
|
|
t.Run("should fail when proto type already exists", func(t *testing.T) {
|
|
tmp := t.TempDir()
|
|
protoFile := filepath.Join(tmp, "proto", "blog", "blog", "v1", "post.proto")
|
|
require.NoError(t, os.MkdirAll(filepath.Dir(protoFile), 0o755))
|
|
|
|
content := `syntax = "proto3";
|
|
package blog.blog.v1;
|
|
|
|
message Post {}
|
|
`
|
|
require.NoError(t, os.WriteFile(protoFile, []byte(content), 0o644))
|
|
|
|
name, err := multiformatname.NewName("post")
|
|
require.NoError(t, err)
|
|
|
|
err = checkTypeProtoCreated(context.Background(), tmp, "blog", "proto", "blog", name)
|
|
require.EqualError(t, err, "component type with name post is already created (type Post exists)")
|
|
})
|
|
|
|
t.Run("should pass when proto type does not exist", func(t *testing.T) {
|
|
tmp := t.TempDir()
|
|
protoFile := filepath.Join(tmp, "proto", "blog", "blog", "v1", "comment.proto")
|
|
require.NoError(t, os.MkdirAll(filepath.Dir(protoFile), 0o755))
|
|
|
|
content := `syntax = "proto3";
|
|
package blog.blog.v1;
|
|
|
|
message Comment {}
|
|
`
|
|
require.NoError(t, os.WriteFile(protoFile, []byte(content), 0o644))
|
|
|
|
name, err := multiformatname.NewName("post")
|
|
require.NoError(t, err)
|
|
|
|
require.NoError(t, checkTypeProtoCreated(context.Background(), tmp, "blog", "proto", "blog", name))
|
|
})
|
|
}
|
|
|
|
func TestCustomFieldType(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
fieldType string
|
|
wantType string
|
|
isCustom bool
|
|
}{
|
|
{
|
|
name: "built-in scalar type",
|
|
fieldType: "string",
|
|
isCustom: false,
|
|
},
|
|
{
|
|
name: "built-in array type",
|
|
fieldType: "array.string",
|
|
isCustom: false,
|
|
},
|
|
{
|
|
name: "custom scalar type",
|
|
fieldType: "ProductDetails",
|
|
wantType: "ProductDetails",
|
|
isCustom: true,
|
|
},
|
|
{
|
|
name: "custom scalar type lower case",
|
|
fieldType: "productDetails",
|
|
wantType: "ProductDetails",
|
|
isCustom: true,
|
|
},
|
|
{
|
|
name: "custom array type",
|
|
fieldType: "array.ProductDetails",
|
|
wantType: "ProductDetails",
|
|
isCustom: true,
|
|
},
|
|
{
|
|
name: "custom array type lower case",
|
|
fieldType: "array.productDetails",
|
|
wantType: "ProductDetails",
|
|
isCustom: true,
|
|
},
|
|
}
|
|
|
|
for _, tc := range tests {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
gotType, isCustom := customFieldType(tc.fieldType)
|
|
require.Equal(t, tc.isCustom, isCustom)
|
|
require.Equal(t, tc.wantType, gotType)
|
|
})
|
|
}
|
|
}
|