197 lines
4.8 KiB
Go
197 lines
4.8 KiB
Go
|
|
package tdd
|
||
|
|
|
||
|
|
import (
|
||
|
|
"embed"
|
||
|
|
"io"
|
||
|
|
"testing"
|
||
|
|
|
||
|
|
"github.com/Snider/Core/pkg/core"
|
||
|
|
"github.com/stretchr/testify/assert"
|
||
|
|
"github.com/wailsapp/wails/v3/pkg/application"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestCore_New_Good(t *testing.T) {
|
||
|
|
c, err := core.New()
|
||
|
|
assert.NoError(t, err)
|
||
|
|
assert.NotNil(t, c)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Mock service for testing
|
||
|
|
type MockService struct {
|
||
|
|
Name string
|
||
|
|
}
|
||
|
|
|
||
|
|
func (m *MockService) GetName() string {
|
||
|
|
return m.Name
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCore_WithService_Good(t *testing.T) {
|
||
|
|
factory := func(c *core.Core) (any, error) {
|
||
|
|
return &MockService{Name: "test"}, nil
|
||
|
|
}
|
||
|
|
c, err := core.New(core.WithService(factory))
|
||
|
|
assert.NoError(t, err)
|
||
|
|
svc := c.Service("tdd")
|
||
|
|
assert.NotNil(t, svc)
|
||
|
|
mockSvc, ok := svc.(*MockService)
|
||
|
|
assert.True(t, ok)
|
||
|
|
assert.Equal(t, "test", mockSvc.GetName())
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCore_WithService_Bad(t *testing.T) {
|
||
|
|
factory := func(c *core.Core) (any, error) {
|
||
|
|
return nil, assert.AnError
|
||
|
|
}
|
||
|
|
_, err := core.New(core.WithService(factory))
|
||
|
|
assert.Error(t, err)
|
||
|
|
assert.ErrorIs(t, err, assert.AnError)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCore_WithWails_Good(t *testing.T) {
|
||
|
|
app := &application.App{}
|
||
|
|
c, err := core.New(core.WithWails(app))
|
||
|
|
assert.NoError(t, err)
|
||
|
|
assert.Equal(t, app, c.App)
|
||
|
|
}
|
||
|
|
|
||
|
|
//go:embed testdata
|
||
|
|
var testFS embed.FS
|
||
|
|
|
||
|
|
func TestCore_WithAssets_Good(t *testing.T) {
|
||
|
|
c, err := core.New(core.WithAssets(testFS))
|
||
|
|
assert.NoError(t, err)
|
||
|
|
assets := c.Assets()
|
||
|
|
file, err := assets.Open("testdata/test.txt")
|
||
|
|
assert.NoError(t, err)
|
||
|
|
defer file.Close()
|
||
|
|
content, err := io.ReadAll(file)
|
||
|
|
assert.NoError(t, err)
|
||
|
|
assert.Equal(t, "hello from testdata\n", string(content))
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCore_WithServiceLock_Good(t *testing.T) {
|
||
|
|
c, err := core.New(core.WithServiceLock())
|
||
|
|
assert.NoError(t, err)
|
||
|
|
err = c.RegisterService("test", &MockService{})
|
||
|
|
assert.Error(t, err)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCore_RegisterService_Good(t *testing.T) {
|
||
|
|
c, err := core.New()
|
||
|
|
assert.NoError(t, err)
|
||
|
|
err = c.RegisterService("test", &MockService{Name: "test"})
|
||
|
|
assert.NoError(t, err)
|
||
|
|
svc := c.Service("test")
|
||
|
|
assert.NotNil(t, svc)
|
||
|
|
mockSvc, ok := svc.(*MockService)
|
||
|
|
assert.True(t, ok)
|
||
|
|
assert.Equal(t, "test", mockSvc.GetName())
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCore_RegisterService_Bad(t *testing.T) {
|
||
|
|
c, err := core.New()
|
||
|
|
assert.NoError(t, err)
|
||
|
|
err = c.RegisterService("test", &MockService{})
|
||
|
|
assert.NoError(t, err)
|
||
|
|
err = c.RegisterService("test", &MockService{})
|
||
|
|
assert.Error(t, err)
|
||
|
|
err = c.RegisterService("", &MockService{})
|
||
|
|
assert.Error(t, err)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCore_ServiceFor_Good(t *testing.T) {
|
||
|
|
c, err := core.New()
|
||
|
|
assert.NoError(t, err)
|
||
|
|
err = c.RegisterService("test", &MockService{Name: "test"})
|
||
|
|
assert.NoError(t, err)
|
||
|
|
svc, err := core.ServiceFor[*MockService](c, "test")
|
||
|
|
assert.NoError(t, err)
|
||
|
|
assert.Equal(t, "test", svc.GetName())
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCore_ServiceFor_Bad(t *testing.T) {
|
||
|
|
c, err := core.New()
|
||
|
|
assert.NoError(t, err)
|
||
|
|
_, err = core.ServiceFor[*MockService](c, "nonexistent")
|
||
|
|
assert.Error(t, err)
|
||
|
|
err = c.RegisterService("test", "not a service")
|
||
|
|
assert.NoError(t, err)
|
||
|
|
_, err = core.ServiceFor[*MockService](c, "test")
|
||
|
|
assert.Error(t, err)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCore_MustServiceFor_Good(t *testing.T) {
|
||
|
|
c, err := core.New()
|
||
|
|
assert.NoError(t, err)
|
||
|
|
err = c.RegisterService("test", &MockService{Name: "test"})
|
||
|
|
assert.NoError(t, err)
|
||
|
|
svc := core.MustServiceFor[*MockService](c, "test")
|
||
|
|
assert.Equal(t, "test", svc.GetName())
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCore_MustServiceFor_Ugly(t *testing.T) {
|
||
|
|
c, err := core.New()
|
||
|
|
assert.NoError(t, err)
|
||
|
|
assert.Panics(t, func() {
|
||
|
|
core.MustServiceFor[*MockService](c, "nonexistent")
|
||
|
|
})
|
||
|
|
err = c.RegisterService("test", "not a service")
|
||
|
|
assert.NoError(t, err)
|
||
|
|
assert.Panics(t, func() {
|
||
|
|
core.MustServiceFor[*MockService](c, "test")
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
type MockAction struct {
|
||
|
|
handled bool
|
||
|
|
}
|
||
|
|
|
||
|
|
func (a *MockAction) Handle(c *core.Core, msg core.Message) error {
|
||
|
|
a.handled = true
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCore_ACTION_Good(t *testing.T) {
|
||
|
|
c, err := core.New()
|
||
|
|
assert.NoError(t, err)
|
||
|
|
action := &MockAction{}
|
||
|
|
c.RegisterAction(action.Handle)
|
||
|
|
err = c.ACTION(nil)
|
||
|
|
assert.NoError(t, err)
|
||
|
|
assert.True(t, action.handled)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCore_RegisterActions_Good(t *testing.T) {
|
||
|
|
c, err := core.New()
|
||
|
|
assert.NoError(t, err)
|
||
|
|
action1 := &MockAction{}
|
||
|
|
action2 := &MockAction{}
|
||
|
|
c.RegisterActions(action1.Handle, action2.Handle)
|
||
|
|
err = c.ACTION(nil)
|
||
|
|
assert.NoError(t, err)
|
||
|
|
assert.True(t, action1.handled)
|
||
|
|
assert.True(t, action2.handled)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCore_WithName_Good(t *testing.T) {
|
||
|
|
factory := func(c *core.Core) (any, error) {
|
||
|
|
return &MockService{Name: "test"}, nil
|
||
|
|
}
|
||
|
|
c, err := core.New(core.WithName("my-service", factory))
|
||
|
|
assert.NoError(t, err)
|
||
|
|
svc := c.Service("my-service")
|
||
|
|
assert.NotNil(t, svc)
|
||
|
|
mockSvc, ok := svc.(*MockService)
|
||
|
|
assert.True(t, ok)
|
||
|
|
assert.Equal(t, "test", mockSvc.GetName())
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCore_WithName_Bad(t *testing.T) {
|
||
|
|
factory := func(c *core.Core) (any, error) {
|
||
|
|
return nil, assert.AnError
|
||
|
|
}
|
||
|
|
_, err := core.New(core.WithName("my-service", factory))
|
||
|
|
assert.Error(t, err)
|
||
|
|
assert.ErrorIs(t, err, assert.AnError)
|
||
|
|
}
|