1
0

feat: 系统性改进后端测试体系

- 新增 6 个测试场景 (config load pipe, handler errors, service aggregation, engine degradation, openai decoder edges, negative tests)
- 更新测试工具规格 (mockgen, in-memory SQLite)
- 覆盖率目标从 >80% 提升至 >85%
- 新增 test-unit 和 test-integration Makefile 命令
- 新增死代码清理和 mockgen 需求
- 归档变更至 openspec/changes/archive/2026-04-22-improve-backend-testing/
This commit is contained in:
2026-04-22 13:18:51 +08:00
parent 59179094ed
commit 4e86adffb7
32 changed files with 3374 additions and 729 deletions

View File

@@ -0,0 +1,193 @@
package config
import (
"os"
"path/filepath"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"nex/backend/internal/config"
)
func TestLoadConfig_DefaultValues(t *testing.T) {
tmpDir := t.TempDir()
configPath := filepath.Join(tmpDir, "config.yaml")
cfg, err := config.LoadConfigFromPath(configPath)
require.NoError(t, err)
assert.Equal(t, 9826, cfg.Server.Port)
assert.Equal(t, 30*time.Second, cfg.Server.ReadTimeout)
assert.Equal(t, 30*time.Second, cfg.Server.WriteTimeout)
assert.Equal(t, 10, cfg.Database.MaxIdleConns)
assert.Equal(t, 100, cfg.Database.MaxOpenConns)
assert.Equal(t, 1*time.Hour, cfg.Database.ConnMaxLifetime)
assert.Equal(t, "info", cfg.Log.Level)
assert.Equal(t, 100, cfg.Log.MaxSize)
assert.Equal(t, 10, cfg.Log.MaxBackups)
assert.Equal(t, 30, cfg.Log.MaxAge)
assert.True(t, cfg.Log.Compress)
}
func TestLoadConfig_EnvOverride(t *testing.T) {
tmpDir := t.TempDir()
configPath := filepath.Join(tmpDir, "config.yaml")
t.Setenv("NEX_SERVER_PORT", "9000")
t.Setenv("NEX_LOG_LEVEL", "debug")
t.Setenv("NEX_DATABASE_MAX_IDLE_CONNS", "20")
cfg, err := config.LoadConfigFromPath(configPath)
require.NoError(t, err)
assert.Equal(t, 9000, cfg.Server.Port)
assert.Equal(t, "debug", cfg.Log.Level)
assert.Equal(t, 20, cfg.Database.MaxIdleConns)
}
func TestLoadConfig_YAMLFile(t *testing.T) {
tmpDir := t.TempDir()
configPath := filepath.Join(tmpDir, "config.yaml")
yamlContent := `
server:
port: 8080
read_timeout: 60s
write_timeout: 60s
database:
path: /custom/path.db
max_idle_conns: 5
max_open_conns: 50
conn_max_lifetime: 2h
log:
level: warn
path: /custom/log
max_size: 200
max_backups: 5
max_age: 7
compress: false
`
err := os.WriteFile(configPath, []byte(yamlContent), 0644)
require.NoError(t, err)
cfg, err := config.LoadConfigFromPath(configPath)
require.NoError(t, err)
assert.Equal(t, 8080, cfg.Server.Port)
assert.Equal(t, 60*time.Second, cfg.Server.ReadTimeout)
assert.Equal(t, 60*time.Second, cfg.Server.WriteTimeout)
assert.Equal(t, "/custom/path.db", cfg.Database.Path)
assert.Equal(t, 5, cfg.Database.MaxIdleConns)
assert.Equal(t, 50, cfg.Database.MaxOpenConns)
assert.Equal(t, 2*time.Hour, cfg.Database.ConnMaxLifetime)
assert.Equal(t, "warn", cfg.Log.Level)
assert.Equal(t, "/custom/log", cfg.Log.Path)
assert.Equal(t, 200, cfg.Log.MaxSize)
assert.Equal(t, 5, cfg.Log.MaxBackups)
assert.Equal(t, 7, cfg.Log.MaxAge)
assert.False(t, cfg.Log.Compress)
}
func TestLoadConfig_PriorityChain(t *testing.T) {
tmpDir := t.TempDir()
configPath := filepath.Join(tmpDir, "config.yaml")
yamlContent := `
server:
port: 8080
log:
level: warn
`
err := os.WriteFile(configPath, []byte(yamlContent), 0644)
require.NoError(t, err)
t.Setenv("NEX_SERVER_PORT", "9000")
originalArgs := os.Args
defer func() { os.Args = originalArgs }()
os.Args = []string{"test", "--server-port", "9999"}
cfg, err := config.LoadConfigFromPath(configPath)
require.NoError(t, err)
assert.Equal(t, 9999, cfg.Server.Port, "CLI should override ENV and YAML")
assert.Equal(t, "warn", cfg.Log.Level, "YAML value should be used when no CLI/ENV override")
}
func TestLoadConfig_AutoCreate(t *testing.T) {
tmpDir := t.TempDir()
configPath := filepath.Join(tmpDir, "config.yaml")
_, err := os.Stat(configPath)
assert.True(t, os.IsNotExist(err), "config file should not exist before load")
cfg, err := config.LoadConfigFromPath(configPath)
require.NoError(t, err)
require.NotNil(t, cfg)
assert.Equal(t, 9826, cfg.Server.Port, "should load with default values")
}
func TestSaveAndLoadConfig(t *testing.T) {
tmpDir := t.TempDir()
homeDir, err := os.UserHomeDir()
require.NoError(t, err)
nexDir := filepath.Join(homeDir, ".nex")
configPath := filepath.Join(nexDir, "config.yaml")
originalConfig, err := os.ReadFile(configPath)
if err != nil && !os.IsNotExist(err) {
require.NoError(t, err)
}
defer func() {
if originalConfig != nil {
_ = os.WriteFile(configPath, originalConfig, 0644)
}
}()
cfg := &config.Config{
Server: config.ServerConfig{
Port: 7777,
ReadTimeout: 45 * time.Second,
WriteTimeout: 45 * time.Second,
},
Database: config.DatabaseConfig{
Path: filepath.Join(tmpDir, "test.db"),
MaxIdleConns: 15,
MaxOpenConns: 150,
ConnMaxLifetime: 2 * time.Hour,
},
Log: config.LogConfig{
Level: "debug",
Path: filepath.Join(tmpDir, "log"),
MaxSize: 50,
MaxBackups: 3,
MaxAge: 14,
Compress: false,
},
}
err = config.SaveConfig(cfg)
require.NoError(t, err)
loaded, err := config.LoadConfig()
require.NoError(t, err)
assert.Equal(t, cfg.Server.Port, loaded.Server.Port)
assert.Equal(t, cfg.Server.ReadTimeout, loaded.Server.ReadTimeout)
assert.Equal(t, cfg.Server.WriteTimeout, loaded.Server.WriteTimeout)
assert.Equal(t, cfg.Database.MaxIdleConns, loaded.Database.MaxIdleConns)
assert.Equal(t, cfg.Database.MaxOpenConns, loaded.Database.MaxOpenConns)
assert.Equal(t, cfg.Database.ConnMaxLifetime, loaded.Database.ConnMaxLifetime)
assert.Equal(t, cfg.Log.Level, loaded.Log.Level)
assert.Equal(t, cfg.Log.MaxSize, loaded.Log.MaxSize)
assert.Equal(t, cfg.Log.MaxBackups, loaded.Log.MaxBackups)
assert.Equal(t, cfg.Log.MaxAge, loaded.Log.MaxAge)
assert.Equal(t, cfg.Log.Compress, loaded.Log.Compress)
}

View File

@@ -7,49 +7,40 @@ import (
"nex/backend/internal/config"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
// SetupTestDB initializes an in-memory SQLite database with auto-migration.
// Uses :memory: mode with MaxOpenConns(1) to ensure all operations share the
// same connection, avoiding "database is closed" errors from connection pool.
// Enables foreign key constraints for SQLite.
func SetupTestDB(t *testing.T) *gorm.DB {
t.Helper()
db, err := gorm.Open(sqlite.Open(":memory:?_foreign_keys=on"), &gorm.Config{})
assert.NoError(t, err, "failed to open test database")
require.NoError(t, err, "failed to open test database")
// 限制为单连接,确保 :memory: 数据库不被连接池丢弃
sqlDB, err := db.DB()
assert.NoError(t, err, "failed to get underlying sql.DB")
require.NoError(t, err, "failed to get underlying sql.DB")
sqlDB.SetMaxOpenConns(1)
sqlDB.SetConnMaxLifetime(0)
err = db.AutoMigrate(&config.Provider{}, &config.Model{}, &config.UsageStats{})
assert.NoError(t, err, "failed to auto-migrate test database")
require.NoError(t, err, "failed to auto-migrate test database")
return db
}
// CleanupTestDB closes the database after a brief delay to allow async
// goroutines (e.g. stats recording) to finish.
func CleanupTestDB(t *testing.T, db *gorm.DB) {
t.Helper()
// 等待异步 goroutine如 statsService.Record完成
time.Sleep(50 * time.Millisecond)
sqlDB, err := db.DB()
assert.NoError(t, err, "failed to get underlying sql.DB")
require.NoError(t, err, "failed to get underlying sql.DB")
err = sqlDB.Close()
assert.NoError(t, err, "failed to close test database")
require.NoError(t, err, "failed to close test database")
}
// CreateTestProvider creates a test provider and returns it.
func CreateTestProvider(t *testing.T, db *gorm.DB, id string) config.Provider {
t.Helper()
@@ -62,13 +53,11 @@ func CreateTestProvider(t *testing.T, db *gorm.DB, id string) config.Provider {
}
err := db.Create(&provider).Error
assert.NoError(t, err, "failed to create test provider")
require.NoError(t, err, "failed to create test provider")
return provider
}
// CreateTestModel creates a test model and returns it.
// Does NOT assert on error - returns the model and error for caller to verify.
func CreateTestModel(t *testing.T, db *gorm.DB, id string, providerID string, modelName string) (config.Model, error) {
t.Helper()

View File

@@ -0,0 +1,143 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: model_repo.go
//
// Generated by this command:
//
// mockgen -source=model_repo.go -destination=../../tests/mocks/mock_model_repository.go -package=mocks
//
// Package mocks is a generated GoMock package.
package mocks
import (
domain "nex/backend/internal/domain"
reflect "reflect"
gomock "go.uber.org/mock/gomock"
)
// MockModelRepository is a mock of ModelRepository interface.
type MockModelRepository struct {
ctrl *gomock.Controller
recorder *MockModelRepositoryMockRecorder
isgomock struct{}
}
// MockModelRepositoryMockRecorder is the mock recorder for MockModelRepository.
type MockModelRepositoryMockRecorder struct {
mock *MockModelRepository
}
// NewMockModelRepository creates a new mock instance.
func NewMockModelRepository(ctrl *gomock.Controller) *MockModelRepository {
mock := &MockModelRepository{ctrl: ctrl}
mock.recorder = &MockModelRepositoryMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockModelRepository) EXPECT() *MockModelRepositoryMockRecorder {
return m.recorder
}
// Create mocks base method.
func (m *MockModelRepository) Create(model *domain.Model) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Create", model)
ret0, _ := ret[0].(error)
return ret0
}
// Create indicates an expected call of Create.
func (mr *MockModelRepositoryMockRecorder) Create(model any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockModelRepository)(nil).Create), model)
}
// Delete mocks base method.
func (m *MockModelRepository) Delete(id string) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Delete", id)
ret0, _ := ret[0].(error)
return ret0
}
// Delete indicates an expected call of Delete.
func (mr *MockModelRepositoryMockRecorder) Delete(id any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockModelRepository)(nil).Delete), id)
}
// FindByProviderAndModelName mocks base method.
func (m *MockModelRepository) FindByProviderAndModelName(providerID, modelName string) (*domain.Model, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "FindByProviderAndModelName", providerID, modelName)
ret0, _ := ret[0].(*domain.Model)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// FindByProviderAndModelName indicates an expected call of FindByProviderAndModelName.
func (mr *MockModelRepositoryMockRecorder) FindByProviderAndModelName(providerID, modelName any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindByProviderAndModelName", reflect.TypeOf((*MockModelRepository)(nil).FindByProviderAndModelName), providerID, modelName)
}
// GetByID mocks base method.
func (m *MockModelRepository) GetByID(id string) (*domain.Model, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetByID", id)
ret0, _ := ret[0].(*domain.Model)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetByID indicates an expected call of GetByID.
func (mr *MockModelRepositoryMockRecorder) GetByID(id any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByID", reflect.TypeOf((*MockModelRepository)(nil).GetByID), id)
}
// List mocks base method.
func (m *MockModelRepository) List(providerID string) ([]domain.Model, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "List", providerID)
ret0, _ := ret[0].([]domain.Model)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// List indicates an expected call of List.
func (mr *MockModelRepositoryMockRecorder) List(providerID any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockModelRepository)(nil).List), providerID)
}
// ListEnabled mocks base method.
func (m *MockModelRepository) ListEnabled() ([]domain.Model, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ListEnabled")
ret0, _ := ret[0].([]domain.Model)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// ListEnabled indicates an expected call of ListEnabled.
func (mr *MockModelRepositoryMockRecorder) ListEnabled() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListEnabled", reflect.TypeOf((*MockModelRepository)(nil).ListEnabled))
}
// Update mocks base method.
func (m *MockModelRepository) Update(id string, updates map[string]any) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Update", id, updates)
ret0, _ := ret[0].(error)
return ret0
}
// Update indicates an expected call of Update.
func (mr *MockModelRepositoryMockRecorder) Update(id, updates any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockModelRepository)(nil).Update), id, updates)
}

View File

@@ -0,0 +1,128 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: model_service.go
//
// Generated by this command:
//
// mockgen -source=model_service.go -destination=../../tests/mocks/mock_model_service.go -package=mocks
//
// Package mocks is a generated GoMock package.
package mocks
import (
domain "nex/backend/internal/domain"
reflect "reflect"
gomock "go.uber.org/mock/gomock"
)
// MockModelService is a mock of ModelService interface.
type MockModelService struct {
ctrl *gomock.Controller
recorder *MockModelServiceMockRecorder
isgomock struct{}
}
// MockModelServiceMockRecorder is the mock recorder for MockModelService.
type MockModelServiceMockRecorder struct {
mock *MockModelService
}
// NewMockModelService creates a new mock instance.
func NewMockModelService(ctrl *gomock.Controller) *MockModelService {
mock := &MockModelService{ctrl: ctrl}
mock.recorder = &MockModelServiceMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockModelService) EXPECT() *MockModelServiceMockRecorder {
return m.recorder
}
// Create mocks base method.
func (m *MockModelService) Create(model *domain.Model) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Create", model)
ret0, _ := ret[0].(error)
return ret0
}
// Create indicates an expected call of Create.
func (mr *MockModelServiceMockRecorder) Create(model any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockModelService)(nil).Create), model)
}
// Delete mocks base method.
func (m *MockModelService) Delete(id string) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Delete", id)
ret0, _ := ret[0].(error)
return ret0
}
// Delete indicates an expected call of Delete.
func (mr *MockModelServiceMockRecorder) Delete(id any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockModelService)(nil).Delete), id)
}
// Get mocks base method.
func (m *MockModelService) Get(id string) (*domain.Model, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Get", id)
ret0, _ := ret[0].(*domain.Model)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// Get indicates an expected call of Get.
func (mr *MockModelServiceMockRecorder) Get(id any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockModelService)(nil).Get), id)
}
// List mocks base method.
func (m *MockModelService) List(providerID string) ([]domain.Model, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "List", providerID)
ret0, _ := ret[0].([]domain.Model)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// List indicates an expected call of List.
func (mr *MockModelServiceMockRecorder) List(providerID any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockModelService)(nil).List), providerID)
}
// ListEnabled mocks base method.
func (m *MockModelService) ListEnabled() ([]domain.Model, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ListEnabled")
ret0, _ := ret[0].([]domain.Model)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// ListEnabled indicates an expected call of ListEnabled.
func (mr *MockModelServiceMockRecorder) ListEnabled() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListEnabled", reflect.TypeOf((*MockModelService)(nil).ListEnabled))
}
// Update mocks base method.
func (m *MockModelService) Update(id string, updates map[string]any) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Update", id, updates)
ret0, _ := ret[0].(error)
return ret0
}
// Update indicates an expected call of Update.
func (mr *MockModelServiceMockRecorder) Update(id, updates any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockModelService)(nil).Update), id, updates)
}

View File

@@ -0,0 +1,73 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: client.go
//
// Generated by this command:
//
// mockgen -source=client.go -destination=../../tests/mocks/mock_provider_client.go -package=mocks
//
// Package mocks is a generated GoMock package.
package mocks
import (
context "context"
conversion "nex/backend/internal/conversion"
provider "nex/backend/internal/provider"
reflect "reflect"
gomock "go.uber.org/mock/gomock"
)
// MockProviderClient is a mock of ProviderClient interface.
type MockProviderClient struct {
ctrl *gomock.Controller
recorder *MockProviderClientMockRecorder
isgomock struct{}
}
// MockProviderClientMockRecorder is the mock recorder for MockProviderClient.
type MockProviderClientMockRecorder struct {
mock *MockProviderClient
}
// NewMockProviderClient creates a new mock instance.
func NewMockProviderClient(ctrl *gomock.Controller) *MockProviderClient {
mock := &MockProviderClient{ctrl: ctrl}
mock.recorder = &MockProviderClientMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockProviderClient) EXPECT() *MockProviderClientMockRecorder {
return m.recorder
}
// Send mocks base method.
func (m *MockProviderClient) Send(ctx context.Context, spec conversion.HTTPRequestSpec) (*conversion.HTTPResponseSpec, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Send", ctx, spec)
ret0, _ := ret[0].(*conversion.HTTPResponseSpec)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// Send indicates an expected call of Send.
func (mr *MockProviderClientMockRecorder) Send(ctx, spec any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Send", reflect.TypeOf((*MockProviderClient)(nil).Send), ctx, spec)
}
// SendStream mocks base method.
func (m *MockProviderClient) SendStream(ctx context.Context, spec conversion.HTTPRequestSpec) (<-chan provider.StreamEvent, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "SendStream", ctx, spec)
ret0, _ := ret[0].(<-chan provider.StreamEvent)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// SendStream indicates an expected call of SendStream.
func (mr *MockProviderClientMockRecorder) SendStream(ctx, spec any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendStream", reflect.TypeOf((*MockProviderClient)(nil).SendStream), ctx, spec)
}

View File

@@ -0,0 +1,113 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: provider_repo.go
//
// Generated by this command:
//
// mockgen -source=provider_repo.go -destination=../../tests/mocks/mock_provider_repository.go -package=mocks
//
// Package mocks is a generated GoMock package.
package mocks
import (
domain "nex/backend/internal/domain"
reflect "reflect"
gomock "go.uber.org/mock/gomock"
)
// MockProviderRepository is a mock of ProviderRepository interface.
type MockProviderRepository struct {
ctrl *gomock.Controller
recorder *MockProviderRepositoryMockRecorder
isgomock struct{}
}
// MockProviderRepositoryMockRecorder is the mock recorder for MockProviderRepository.
type MockProviderRepositoryMockRecorder struct {
mock *MockProviderRepository
}
// NewMockProviderRepository creates a new mock instance.
func NewMockProviderRepository(ctrl *gomock.Controller) *MockProviderRepository {
mock := &MockProviderRepository{ctrl: ctrl}
mock.recorder = &MockProviderRepositoryMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockProviderRepository) EXPECT() *MockProviderRepositoryMockRecorder {
return m.recorder
}
// Create mocks base method.
func (m *MockProviderRepository) Create(provider *domain.Provider) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Create", provider)
ret0, _ := ret[0].(error)
return ret0
}
// Create indicates an expected call of Create.
func (mr *MockProviderRepositoryMockRecorder) Create(provider any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockProviderRepository)(nil).Create), provider)
}
// Delete mocks base method.
func (m *MockProviderRepository) Delete(id string) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Delete", id)
ret0, _ := ret[0].(error)
return ret0
}
// Delete indicates an expected call of Delete.
func (mr *MockProviderRepositoryMockRecorder) Delete(id any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockProviderRepository)(nil).Delete), id)
}
// GetByID mocks base method.
func (m *MockProviderRepository) GetByID(id string) (*domain.Provider, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetByID", id)
ret0, _ := ret[0].(*domain.Provider)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetByID indicates an expected call of GetByID.
func (mr *MockProviderRepositoryMockRecorder) GetByID(id any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByID", reflect.TypeOf((*MockProviderRepository)(nil).GetByID), id)
}
// List mocks base method.
func (m *MockProviderRepository) List() ([]domain.Provider, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "List")
ret0, _ := ret[0].([]domain.Provider)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// List indicates an expected call of List.
func (mr *MockProviderRepositoryMockRecorder) List() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockProviderRepository)(nil).List))
}
// Update mocks base method.
func (m *MockProviderRepository) Update(id string, updates map[string]any) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Update", id, updates)
ret0, _ := ret[0].(error)
return ret0
}
// Update indicates an expected call of Update.
func (mr *MockProviderRepositoryMockRecorder) Update(id, updates any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockProviderRepository)(nil).Update), id, updates)
}

View File

@@ -0,0 +1,143 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: provider_service.go
//
// Generated by this command:
//
// mockgen -source=provider_service.go -destination=../../tests/mocks/mock_provider_service.go -package=mocks
//
// Package mocks is a generated GoMock package.
package mocks
import (
domain "nex/backend/internal/domain"
reflect "reflect"
gomock "go.uber.org/mock/gomock"
)
// MockProviderService is a mock of ProviderService interface.
type MockProviderService struct {
ctrl *gomock.Controller
recorder *MockProviderServiceMockRecorder
isgomock struct{}
}
// MockProviderServiceMockRecorder is the mock recorder for MockProviderService.
type MockProviderServiceMockRecorder struct {
mock *MockProviderService
}
// NewMockProviderService creates a new mock instance.
func NewMockProviderService(ctrl *gomock.Controller) *MockProviderService {
mock := &MockProviderService{ctrl: ctrl}
mock.recorder = &MockProviderServiceMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockProviderService) EXPECT() *MockProviderServiceMockRecorder {
return m.recorder
}
// Create mocks base method.
func (m *MockProviderService) Create(provider *domain.Provider) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Create", provider)
ret0, _ := ret[0].(error)
return ret0
}
// Create indicates an expected call of Create.
func (mr *MockProviderServiceMockRecorder) Create(provider any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockProviderService)(nil).Create), provider)
}
// Delete mocks base method.
func (m *MockProviderService) Delete(id string) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Delete", id)
ret0, _ := ret[0].(error)
return ret0
}
// Delete indicates an expected call of Delete.
func (mr *MockProviderServiceMockRecorder) Delete(id any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockProviderService)(nil).Delete), id)
}
// Get mocks base method.
func (m *MockProviderService) Get(id string, maskKey bool) (*domain.Provider, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Get", id, maskKey)
ret0, _ := ret[0].(*domain.Provider)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// Get indicates an expected call of Get.
func (mr *MockProviderServiceMockRecorder) Get(id, maskKey any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockProviderService)(nil).Get), id, maskKey)
}
// GetModelByProviderAndName mocks base method.
func (m *MockProviderService) GetModelByProviderAndName(providerID, modelName string) (*domain.Model, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetModelByProviderAndName", providerID, modelName)
ret0, _ := ret[0].(*domain.Model)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetModelByProviderAndName indicates an expected call of GetModelByProviderAndName.
func (mr *MockProviderServiceMockRecorder) GetModelByProviderAndName(providerID, modelName any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetModelByProviderAndName", reflect.TypeOf((*MockProviderService)(nil).GetModelByProviderAndName), providerID, modelName)
}
// List mocks base method.
func (m *MockProviderService) List() ([]domain.Provider, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "List")
ret0, _ := ret[0].([]domain.Provider)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// List indicates an expected call of List.
func (mr *MockProviderServiceMockRecorder) List() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockProviderService)(nil).List))
}
// ListEnabledModels mocks base method.
func (m *MockProviderService) ListEnabledModels() ([]domain.Model, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ListEnabledModels")
ret0, _ := ret[0].([]domain.Model)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// ListEnabledModels indicates an expected call of ListEnabledModels.
func (mr *MockProviderServiceMockRecorder) ListEnabledModels() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListEnabledModels", reflect.TypeOf((*MockProviderService)(nil).ListEnabledModels))
}
// Update mocks base method.
func (m *MockProviderService) Update(id string, updates map[string]any) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Update", id, updates)
ret0, _ := ret[0].(error)
return ret0
}
// Update indicates an expected call of Update.
func (mr *MockProviderServiceMockRecorder) Update(id, updates any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockProviderService)(nil).Update), id, updates)
}

View File

@@ -0,0 +1,56 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: routing_service.go
//
// Generated by this command:
//
// mockgen -source=routing_service.go -destination=../../tests/mocks/mock_routing_service.go -package=mocks
//
// Package mocks is a generated GoMock package.
package mocks
import (
domain "nex/backend/internal/domain"
reflect "reflect"
gomock "go.uber.org/mock/gomock"
)
// MockRoutingService is a mock of RoutingService interface.
type MockRoutingService struct {
ctrl *gomock.Controller
recorder *MockRoutingServiceMockRecorder
isgomock struct{}
}
// MockRoutingServiceMockRecorder is the mock recorder for MockRoutingService.
type MockRoutingServiceMockRecorder struct {
mock *MockRoutingService
}
// NewMockRoutingService creates a new mock instance.
func NewMockRoutingService(ctrl *gomock.Controller) *MockRoutingService {
mock := &MockRoutingService{ctrl: ctrl}
mock.recorder = &MockRoutingServiceMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockRoutingService) EXPECT() *MockRoutingServiceMockRecorder {
return m.recorder
}
// RouteByModelName mocks base method.
func (m *MockRoutingService) RouteByModelName(providerID, modelName string) (*domain.RouteResult, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "RouteByModelName", providerID, modelName)
ret0, _ := ret[0].(*domain.RouteResult)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// RouteByModelName indicates an expected call of RouteByModelName.
func (mr *MockRoutingServiceMockRecorder) RouteByModelName(providerID, modelName any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RouteByModelName", reflect.TypeOf((*MockRoutingService)(nil).RouteByModelName), providerID, modelName)
}

View File

@@ -0,0 +1,71 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: stats_repo.go
//
// Generated by this command:
//
// mockgen -source=stats_repo.go -destination=../../tests/mocks/mock_stats_repository.go -package=mocks
//
// Package mocks is a generated GoMock package.
package mocks
import (
domain "nex/backend/internal/domain"
reflect "reflect"
time "time"
gomock "go.uber.org/mock/gomock"
)
// MockStatsRepository is a mock of StatsRepository interface.
type MockStatsRepository struct {
ctrl *gomock.Controller
recorder *MockStatsRepositoryMockRecorder
isgomock struct{}
}
// MockStatsRepositoryMockRecorder is the mock recorder for MockStatsRepository.
type MockStatsRepositoryMockRecorder struct {
mock *MockStatsRepository
}
// NewMockStatsRepository creates a new mock instance.
func NewMockStatsRepository(ctrl *gomock.Controller) *MockStatsRepository {
mock := &MockStatsRepository{ctrl: ctrl}
mock.recorder = &MockStatsRepositoryMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockStatsRepository) EXPECT() *MockStatsRepositoryMockRecorder {
return m.recorder
}
// Query mocks base method.
func (m *MockStatsRepository) Query(providerID, modelName string, startDate, endDate *time.Time) ([]domain.UsageStats, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Query", providerID, modelName, startDate, endDate)
ret0, _ := ret[0].([]domain.UsageStats)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// Query indicates an expected call of Query.
func (mr *MockStatsRepositoryMockRecorder) Query(providerID, modelName, startDate, endDate any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*MockStatsRepository)(nil).Query), providerID, modelName, startDate, endDate)
}
// Record mocks base method.
func (m *MockStatsRepository) Record(providerID, modelName string) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Record", providerID, modelName)
ret0, _ := ret[0].(error)
return ret0
}
// Record indicates an expected call of Record.
func (mr *MockStatsRepositoryMockRecorder) Record(providerID, modelName any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Record", reflect.TypeOf((*MockStatsRepository)(nil).Record), providerID, modelName)
}

View File

@@ -0,0 +1,85 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: stats_service.go
//
// Generated by this command:
//
// mockgen -source=stats_service.go -destination=../../tests/mocks/mock_stats_service.go -package=mocks
//
// Package mocks is a generated GoMock package.
package mocks
import (
domain "nex/backend/internal/domain"
reflect "reflect"
time "time"
gomock "go.uber.org/mock/gomock"
)
// MockStatsService is a mock of StatsService interface.
type MockStatsService struct {
ctrl *gomock.Controller
recorder *MockStatsServiceMockRecorder
isgomock struct{}
}
// MockStatsServiceMockRecorder is the mock recorder for MockStatsService.
type MockStatsServiceMockRecorder struct {
mock *MockStatsService
}
// NewMockStatsService creates a new mock instance.
func NewMockStatsService(ctrl *gomock.Controller) *MockStatsService {
mock := &MockStatsService{ctrl: ctrl}
mock.recorder = &MockStatsServiceMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockStatsService) EXPECT() *MockStatsServiceMockRecorder {
return m.recorder
}
// Aggregate mocks base method.
func (m *MockStatsService) Aggregate(stats []domain.UsageStats, groupBy string) []map[string]any {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Aggregate", stats, groupBy)
ret0, _ := ret[0].([]map[string]any)
return ret0
}
// Aggregate indicates an expected call of Aggregate.
func (mr *MockStatsServiceMockRecorder) Aggregate(stats, groupBy any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Aggregate", reflect.TypeOf((*MockStatsService)(nil).Aggregate), stats, groupBy)
}
// Get mocks base method.
func (m *MockStatsService) Get(providerID, modelName string, startDate, endDate *time.Time) ([]domain.UsageStats, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Get", providerID, modelName, startDate, endDate)
ret0, _ := ret[0].([]domain.UsageStats)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// Get indicates an expected call of Get.
func (mr *MockStatsServiceMockRecorder) Get(providerID, modelName, startDate, endDate any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockStatsService)(nil).Get), providerID, modelName, startDate, endDate)
}
// Record mocks base method.
func (m *MockStatsService) Record(providerID, modelName string) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Record", providerID, modelName)
ret0, _ := ret[0].(error)
return ret0
}
// Record indicates an expected call of Record.
func (mr *MockStatsServiceMockRecorder) Record(providerID, modelName any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Record", reflect.TypeOf((*MockStatsService)(nil).Record), providerID, modelName)
}