helpers

package
v2.6.0-beta9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 11, 2025 License: GPL-3.0 Imports: 32 Imported by: 0

Documentation

Overview

Package helpers provides testing utilities for API operations.

This package includes WebSocket test servers and helper functions for testing API endpoints, WebSocket communication, and JSON-RPC methods without requiring a full API server setup.

Example usage:

func TestWebSocketAPI(t *testing.T) {
	// Create message handler
	handler := func(session *melody.Session, msg []byte) {
		session.Write([]byte(`{"response": "ok"}`))
	}

	// Create test WebSocket server
	server := helpers.NewWebSocketTestServer(t, handler)
	defer server.Close()

	// Connect and test
	client := server.NewClient(t)
	defer client.Close()

	err := client.SendMessage([]byte(`{"test": "message"}`))
	require.NoError(t, err)
}

For complete examples, see pkg/testing/examples/api_example_test.go

Package helpers provides testing utilities for database operations.

This package includes mock implementations of database interfaces and helper functions for setting up test databases with sqlmock. It enables testing database operations without requiring a real SQLite database.

Example usage:

func TestDatabaseOperations(t *testing.T) {
	// Create mock database interfaces
	userDB := helpers.NewMockUserDBI()
	mediaDB := helpers.NewMockMediaDBI()

	// Set up expectations
	userDB.On("AddHistory", helpers.HistoryEntryMatcher()).Return(nil)

	// Use in your code
	err := MyFunction(userDB)

	// Verify expectations were met
	require.NoError(t, err)
	userDB.AssertExpectations(t)
}

For complete examples, see pkg/testing/examples/database_example_test.go

Package helpers provides testing utilities for filesystem operations.

This package includes in-memory filesystem implementations and helper functions for testing file operations without requiring real filesystem access. It uses afero for filesystem abstraction.

Example usage:

func TestFileOperations(t *testing.T) {
	// Create in-memory filesystem
	fs := helpers.NewMemoryFS()

	// Create files and directories for testing
	fs.WriteFile("test.txt", []byte("content"))
	fs.MkdirAll("configs")

	// Create test configuration
	cfg, err := helpers.NewTestConfig(fs, "/tmp/config")
	require.NoError(t, err)

	// Use in your tests
	content, err := fs.ReadFile("test.txt")
	require.NoError(t, err)
	assert.Equal(t, "content", string(content))
}

For complete examples, see pkg/testing/examples/filesystem_example_test.go

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func AssertJSONRPCError

func AssertJSONRPCError(t *testing.T, response *JSONRPCResponse, expectedCode int)

AssertJSONRPCError verifies a JSON-RPC response contains an error

func AssertJSONRPCSuccess

func AssertJSONRPCSuccess(t *testing.T, response *JSONRPCResponse)

AssertJSONRPCSuccess verifies a JSON-RPC response was successful

func CreateTestContext

func CreateTestContext(timeout time.Duration) (context.Context, context.CancelFunc)

CreateTestContext creates a context with timeout for testing

func ExpectHistoryInsert

func ExpectHistoryInsert(mockDB sqlmock.Sqlmock, entry *database.HistoryEntry)

ExpectHistoryInsert sets up expectations for history insertion

func ExpectMappingInsert

func ExpectMappingInsert(mockDB sqlmock.Sqlmock, mapping *database.Mapping)

ExpectMappingInsert sets up expectations for mapping insertion

func ExpectMappingQuery

func ExpectMappingQuery(mockDB sqlmock.Sqlmock, id int64, mapping *database.Mapping)

ExpectMappingQuery sets up expectations for mapping query

func ExpectMediaSearch

func ExpectMediaSearch(mockDB sqlmock.Sqlmock, results []database.SearchResult)

ExpectMediaSearch sets up expectations for media search queries

func ExpectTransactionBegin

func ExpectTransactionBegin(mockDB sqlmock.Sqlmock)

ExpectTransactionBegin sets up expectations for transaction begin

func ExpectTransactionCommit

func ExpectTransactionCommit(mockDB sqlmock.Sqlmock)

ExpectTransactionCommit sets up expectations for transaction commit

func ExpectTransactionRollback

func ExpectTransactionRollback(mockDB sqlmock.Sqlmock)

ExpectTransactionRollback sets up expectations for transaction rollback

func GetBasicTestStructure

func GetBasicTestStructure() map[string]any

GetBasicTestStructure returns a basic directory structure for testing

func GetComplexTestStructure

func GetComplexTestStructure() map[string]any

GetComplexTestStructure returns a more complex directory structure for integration testing

func HistoryEntryMatcher

func HistoryEntryMatcher() any

HistoryEntryMatcher returns a testify matcher for database.HistoryEntry. This matcher can be used to verify that AddHistory is called with appropriate data.

Example usage:

userDB.On("AddHistory", helpers.HistoryEntryMatcher()).Return(nil)

func MappingMatcher

func MappingMatcher() any

MappingMatcher returns a testify matcher for database.Mapping.

Example usage:

userDB.On("AddMapping", helpers.MappingMatcher()).Return(nil)

func MediaMatcher

func MediaMatcher() any

MediaMatcher returns a testify matcher for database.Media.

Example usage:

mediaDB.On("InsertMedia", helpers.MediaMatcher()).Return(fixtures.SampleMedia()[0], nil)

func NewInMemoryMediaDB

func NewInMemoryMediaDB(t *testing.T) (db *mediadb.MediaDB, cleanup func())

func NewInMemoryUserDB

func NewInMemoryUserDB(t *testing.T) (db *userdb.UserDB, cleanup func())

func NewSQLMock

func NewSQLMock() (*sql.DB, sqlmock.Sqlmock, error)

NewSQLMock creates a new sqlmock database and mock for raw SQL testing. This is an alias for SetupSQLMock for consistency with other constructor functions.

Example usage:

func TestRawSQL(t *testing.T) {
	db, mock, err := helpers.NewSQLMock()
	require.NoError(t, err)
	defer db.Close()

	mock.ExpectQuery("SELECT (.+) FROM users").
		WillReturnRows(sqlmock.NewRows([]string{"id", "name"}).AddRow(1, "Test"))

	// Test your SQL code
	rows, err := db.Query("SELECT id, name FROM users")
	require.NoError(t, err)
	defer rows.Close()

	assert.NoError(t, mock.ExpectationsWereMet())
}

func NewTestConfig

func NewTestConfig(fs *FSHelper, configDir string) (*config.Instance, error)

NewTestConfig creates a config instance for testing using an in-memory filesystem

func NewTestConfigWithPort

func NewTestConfigWithPort(_ *FSHelper, configDir string, port int) (*config.Instance, error)

NewTestConfigWithPort creates a config instance for testing with a specific API port

func SearchResultMatcher

func SearchResultMatcher() any

SearchResultMatcher returns a testify matcher for database.SearchResult.

Example usage:

mediaDB.On("SearchMedia", helpers.TextMatcher()).
	Return([]database.SearchResult{fixtures.SampleSearchResults()[0]}, nil)

func SystemMatcher

func SystemMatcher() any

SystemMatcher returns a testify matcher for database.System.

Example usage:

platform.On("LaunchMedia", helpers.MediaMatcher(), helpers.SystemMatcher()).Return(nil)

func TextMatcher

func TextMatcher() any

TextMatcher returns a testify matcher for string text matching. Useful for matching media names, token text, etc.

Example usage:

mediaDB.On("GetMediaByText", helpers.TextMatcher()).Return(fixtures.SampleMedia()[0], nil)

Types

type FSHelper

type FSHelper struct {
	Fs afero.Fs
}

FSHelper provides utilities for filesystem mocking in tests

func NewMemoryFS

func NewMemoryFS() *FSHelper

NewMemoryFS creates a new in-memory filesystem for testing

func NewOSFS

func NewOSFS() *FSHelper

NewOSFS creates a filesystem helper using the real filesystem (for integration tests)

func SetupMemoryFilesystem

func SetupMemoryFilesystem() *FSHelper

SetupMemoryFilesystem creates a new in-memory filesystem helper with basic directory structure

func (*FSHelper) CleanupDir

func (h *FSHelper) CleanupDir(path string) error

CleanupDir removes all contents from a directory

func (*FSHelper) CreateAuthFile

func (h *FSHelper) CreateAuthFile(path string, authData []byte) error

CreateAuthFile creates an auth file with the provided content

func (*FSHelper) CreateConfigFile

func (h *FSHelper) CreateConfigFile(path string, cfg map[string]any) error

CreateConfigFile creates a config file with the provided configuration map

func (*FSHelper) CreateDirectoryStructure

func (h *FSHelper) CreateDirectoryStructure(structure map[string]any) error

CreateDirectoryStructure creates a complex directory structure for testing

func (*FSHelper) CreateMediaDirectory

func (h *FSHelper) CreateMediaDirectory(basePath string) error

CreateMediaDirectory creates a media directory structure with sample files

func (*FSHelper) FileExists

func (h *FSHelper) FileExists(path string) bool

FileExists checks if a file exists

func (*FSHelper) ListFiles

func (h *FSHelper) ListFiles(path string) ([]string, error)

ListFiles lists all files in a directory

func (*FSHelper) ReadFile

func (h *FSHelper) ReadFile(path string) ([]byte, error)

ReadFile reads a file and returns its content

func (*FSHelper) SetupTestConfigEnvironment

func (h *FSHelper) SetupTestConfigEnvironment(baseDir string) (map[string]any, error)

SetupTestConfigEnvironment creates a complete test configuration environment

func (*FSHelper) WriteFile

func (h *FSHelper) WriteFile(path string, content []byte, _ int) error

WriteFile writes content to a file

type HTTPTestHelper

type HTTPTestHelper struct {
	Server *httptest.Server
	Client *http.Client
}

HTTPTestHelper provides utilities for testing HTTP API endpoints

func NewHTTPTestHelper

func NewHTTPTestHelper(handler http.Handler) *HTTPTestHelper

NewHTTPTestHelper creates a new HTTP test helper with the given handler

func (*HTTPTestHelper) Close

func (h *HTTPTestHelper) Close()

Close shuts down the test server

func (*HTTPTestHelper) PostJSONRPC

func (h *HTTPTestHelper) PostJSONRPC(method string, params any) (*http.Response, error)

PostJSONRPC sends a JSON-RPC request via HTTP POST

type JSONRPCRequest

type JSONRPCRequest struct {
	Params any       `json:"params,omitempty"`
	Method string    `json:"method"`
	ID     uuid.UUID `json:"id"`
}

JSONRPCRequest represents a JSON-RPC request for testing

type JSONRPCResponse

type JSONRPCResponse struct {
	Result any                 `json:"result,omitempty"`
	Error  *models.ErrorObject `json:"error,omitempty"`
	ID     uuid.UUID           `json:"id"`
}

JSONRPCResponse represents a JSON-RPC response for testing

func SendJSONRPCRequest

func SendJSONRPCRequest(conn *websocket.Conn, method string, params any) (*JSONRPCResponse, error)

SendJSONRPCRequest sends a JSON-RPC request and returns the response

type MockKodiServer

type MockKodiServer struct {
	*httptest.Server
	// contains filtered or unexported fields
}

MockKodiServer provides a mock Kodi JSON-RPC server for integration testing

func NewMockKodiServer

func NewMockKodiServer(_ *testing.T) *MockKodiServer

NewMockKodiServer creates a new mock Kodi server for testing

func (*MockKodiServer) GetURLForConfig

func (m *MockKodiServer) GetURLForConfig() string

GetURLForConfig returns the mock server's URL formatted for Kodi client configuration

func (*MockKodiServer) URL

func (m *MockKodiServer) URL() string

URL returns the mock server's URL for configuration

func (*MockKodiServer) WithActivePlayers

func (m *MockKodiServer) WithActivePlayers() *MockKodiServer

WithActivePlayers configures the mock server to return active players

type MockMediaDBI

type MockMediaDBI struct {
	mock.Mock
}

MockMediaDBI is a mock implementation of the MediaDBI interface using testify/mock

func NewMockMediaDBI

func NewMockMediaDBI() *MockMediaDBI

NewMockMediaDBI creates a new mock MediaDBI interface for testing.

Example usage:

func TestMediaOperations(t *testing.T) {
	mediaDB := helpers.NewMockMediaDBI()
	mediaDB.On("GetMediaByText", "Game Name").Return(fixtures.SampleMedia()[0], nil)

	// Use mediaDB in your test
	media, err := mediaDB.GetMediaByText("Game Name")
	require.NoError(t, err)
	assert.Equal(t, "Game Name", media.Name)
	mediaDB.AssertExpectations(t)
}

func (*MockMediaDBI) Allocate

func (m *MockMediaDBI) Allocate() error

func (*MockMediaDBI) BeginTransaction

func (m *MockMediaDBI) BeginTransaction() error

MediaDBI specific methods - Transaction handling

func (*MockMediaDBI) Close

func (m *MockMediaDBI) Close() error

func (*MockMediaDBI) CommitTransaction

func (m *MockMediaDBI) CommitTransaction() error

func (*MockMediaDBI) Exists

func (m *MockMediaDBI) Exists() bool

func (*MockMediaDBI) FindMedia

func (m *MockMediaDBI) FindMedia(row database.Media) (database.Media, error)

Media CRUD methods

func (*MockMediaDBI) FindMediaTag

func (m *MockMediaDBI) FindMediaTag(row database.MediaTag) (database.MediaTag, error)

MediaTag CRUD methods

func (*MockMediaDBI) FindMediaTitle

func (m *MockMediaDBI) FindMediaTitle(row database.MediaTitle) (database.MediaTitle, error)

MediaTitle CRUD methods

func (*MockMediaDBI) FindOrInsertMedia

func (m *MockMediaDBI) FindOrInsertMedia(row database.Media) (database.Media, error)

func (*MockMediaDBI) FindOrInsertMediaTag

func (m *MockMediaDBI) FindOrInsertMediaTag(row database.MediaTag) (database.MediaTag, error)

func (*MockMediaDBI) FindOrInsertMediaTitle

func (m *MockMediaDBI) FindOrInsertMediaTitle(row database.MediaTitle) (database.MediaTitle, error)

func (*MockMediaDBI) FindOrInsertSystem

func (m *MockMediaDBI) FindOrInsertSystem(row database.System) (database.System, error)

func (*MockMediaDBI) FindOrInsertTag

func (m *MockMediaDBI) FindOrInsertTag(row database.Tag) (database.Tag, error)

func (*MockMediaDBI) FindOrInsertTagType

func (m *MockMediaDBI) FindOrInsertTagType(row database.TagType) (database.TagType, error)

func (*MockMediaDBI) FindSystem

func (m *MockMediaDBI) FindSystem(row database.System) (database.System, error)

System CRUD methods

func (*MockMediaDBI) FindTag

func (m *MockMediaDBI) FindTag(row database.Tag) (database.Tag, error)

Tag CRUD methods

func (*MockMediaDBI) FindTagType

func (m *MockMediaDBI) FindTagType(row database.TagType) (database.TagType, error)

TagType CRUD methods

func (*MockMediaDBI) GetDBPath

func (m *MockMediaDBI) GetDBPath() string

func (*MockMediaDBI) GetLastGenerated

func (m *MockMediaDBI) GetLastGenerated() (time.Time, error)

func (*MockMediaDBI) GetMediaByText

func (m *MockMediaDBI) GetMediaByText(query string) (database.Media, error)

GetMediaByText is a convenience method for testing - wraps SearchMediaPathExact

func (*MockMediaDBI) IndexedSystems

func (m *MockMediaDBI) IndexedSystems() ([]string, error)

func (*MockMediaDBI) InsertMedia

func (m *MockMediaDBI) InsertMedia(row database.Media) (database.Media, error)

func (*MockMediaDBI) InsertMediaTag

func (m *MockMediaDBI) InsertMediaTag(row database.MediaTag) (database.MediaTag, error)

func (*MockMediaDBI) InsertMediaTitle

func (m *MockMediaDBI) InsertMediaTitle(row database.MediaTitle) (database.MediaTitle, error)

func (*MockMediaDBI) InsertSystem

func (m *MockMediaDBI) InsertSystem(row database.System) (database.System, error)

func (*MockMediaDBI) InsertTag

func (m *MockMediaDBI) InsertTag(row database.Tag) (database.Tag, error)

func (*MockMediaDBI) InsertTagType

func (m *MockMediaDBI) InsertTagType(row database.TagType) (database.TagType, error)

func (*MockMediaDBI) MigrateUp

func (m *MockMediaDBI) MigrateUp() error

func (*MockMediaDBI) Open

func (m *MockMediaDBI) Open() error

GenericDBI methods

func (*MockMediaDBI) RandomGame

func (m *MockMediaDBI) RandomGame(systems []systemdefs.System) (database.SearchResult, error)

func (*MockMediaDBI) ReindexTables

func (m *MockMediaDBI) ReindexTables() error

func (*MockMediaDBI) RollbackTransaction

func (m *MockMediaDBI) RollbackTransaction() error

func (*MockMediaDBI) SearchMediaPathExact

func (m *MockMediaDBI) SearchMediaPathExact(
	systems []systemdefs.System, query string,
) ([]database.SearchResult, error)

Search methods

func (*MockMediaDBI) SearchMediaPathGlob

func (m *MockMediaDBI) SearchMediaPathGlob(systems []systemdefs.System, query string) ([]database.SearchResult, error)

func (*MockMediaDBI) SearchMediaPathWords

func (m *MockMediaDBI) SearchMediaPathWords(
	systems []systemdefs.System, query string,
) ([]database.SearchResult, error)

func (*MockMediaDBI) SystemIndexed

func (m *MockMediaDBI) SystemIndexed(system systemdefs.System) bool

func (*MockMediaDBI) Truncate

func (m *MockMediaDBI) Truncate() error

func (*MockMediaDBI) UnsafeGetSQLDb

func (m *MockMediaDBI) UnsafeGetSQLDb() *sql.DB

func (*MockMediaDBI) UpdateLastGenerated

func (m *MockMediaDBI) UpdateLastGenerated() error

func (*MockMediaDBI) Vacuum

func (m *MockMediaDBI) Vacuum() error

type MockUserDBI

type MockUserDBI struct {
	mock.Mock
}

MockUserDBI is a mock implementation of the UserDBI interface using testify/mock

func NewMockUserDBI

func NewMockUserDBI() *MockUserDBI

NewMockUserDBI creates a new mock UserDBI interface for testing.

Example usage:

func TestUserOperations(t *testing.T) {
	userDB := helpers.NewMockUserDBI()
	userDB.On("AddHistory", mock.MatchedBy(func(he database.HistoryEntry) bool {
		return he.TokenID != ""
	})).Return(nil)

	// Use userDB in your test
	err := MyFunction(userDB)
	require.NoError(t, err)
	userDB.AssertExpectations(t)
}

func (*MockUserDBI) AddHistory

func (m *MockUserDBI) AddHistory(entry *database.HistoryEntry) error

UserDBI specific methods

func (*MockUserDBI) AddMapping

func (m *MockUserDBI) AddMapping(mapping *database.Mapping) error

func (*MockUserDBI) Allocate

func (m *MockUserDBI) Allocate() error

func (*MockUserDBI) Close

func (m *MockUserDBI) Close() error

func (*MockUserDBI) DeleteMapping

func (m *MockUserDBI) DeleteMapping(id int64) error

func (*MockUserDBI) GetAllMappings

func (m *MockUserDBI) GetAllMappings() ([]database.Mapping, error)

func (*MockUserDBI) GetDBPath

func (m *MockUserDBI) GetDBPath() string

func (*MockUserDBI) GetEnabledMappings

func (m *MockUserDBI) GetEnabledMappings() ([]database.Mapping, error)

func (*MockUserDBI) GetHistory

func (m *MockUserDBI) GetHistory(lastID int) ([]database.HistoryEntry, error)

func (*MockUserDBI) GetMapping

func (m *MockUserDBI) GetMapping(id int64) (database.Mapping, error)

func (*MockUserDBI) GetZapLinkCache

func (m *MockUserDBI) GetZapLinkCache(url string) (string, error)

func (*MockUserDBI) GetZapLinkHost

func (m *MockUserDBI) GetZapLinkHost(host string) (exists, zapscript bool, err error)

func (*MockUserDBI) MigrateUp

func (m *MockUserDBI) MigrateUp() error

func (*MockUserDBI) Open

func (m *MockUserDBI) Open() error

GenericDBI methods

func (*MockUserDBI) Truncate

func (m *MockUserDBI) Truncate() error

func (*MockUserDBI) UnsafeGetSQLDb

func (m *MockUserDBI) UnsafeGetSQLDb() *sql.DB

func (*MockUserDBI) UpdateMapping

func (m *MockUserDBI) UpdateMapping(id int64, mapping *database.Mapping) error

func (*MockUserDBI) UpdateZapLinkCache

func (m *MockUserDBI) UpdateZapLinkCache(url, zapscript string) error

func (*MockUserDBI) UpdateZapLinkHost

func (m *MockUserDBI) UpdateZapLinkHost(host string, zapscript int) error

func (*MockUserDBI) Vacuum

func (m *MockUserDBI) Vacuum() error

type MockWebSocketConnection

type MockWebSocketConnection struct {
	CloseError       error
	WriteError       error
	ReadError        error
	SentMessages     [][]byte
	ReceivedMessages [][]byte

	Closed bool
	// contains filtered or unexported fields
}

MockWebSocketConnection provides a mock implementation for testing

func NewMockWebSocketConnection

func NewMockWebSocketConnection() *MockWebSocketConnection

NewMockWebSocketConnection creates a new mock WebSocket connection

func (*MockWebSocketConnection) ClearSentMessages

func (m *MockWebSocketConnection) ClearSentMessages()

ClearSentMessages clears all sent messages

func (*MockWebSocketConnection) Close

func (m *MockWebSocketConnection) Close() error

Close simulates closing the connection

func (*MockWebSocketConnection) GetSentMessages

func (m *MockWebSocketConnection) GetSentMessages() [][]byte

GetSentMessages returns all sent messages (thread-safe copy)

func (*MockWebSocketConnection) QueueMessage

func (m *MockWebSocketConnection) QueueMessage(data []byte)

QueueMessage adds a message to the read queue

func (*MockWebSocketConnection) ReadMessage

func (m *MockWebSocketConnection) ReadMessage() (messageType int, data []byte, err error)

ReadMessage simulates reading a message

func (*MockWebSocketConnection) SetCloseError

func (m *MockWebSocketConnection) SetCloseError(err error)

SetCloseError sets an error to be returned on close operations

func (*MockWebSocketConnection) SetReadError

func (m *MockWebSocketConnection) SetReadError(err error)

SetReadError sets an error to be returned on read operations

func (*MockWebSocketConnection) SetWriteError

func (m *MockWebSocketConnection) SetWriteError(err error)

SetWriteError sets an error to be returned on write operations

func (*MockWebSocketConnection) WriteMessage

func (m *MockWebSocketConnection) WriteMessage(_ int, data []byte) error

WriteMessage simulates writing a message

type WebSocketMessage

type WebSocketMessage struct {
	Timestamp time.Time `json:"timestamp"`
	Error     error     `json:"error,omitempty"`
	Type      string    `json:"type"`
	SessionID string    `json:"sessionId,omitempty"`
	Data      []byte    `json:"data"`
}

WebSocketMessage captures a message sent or received during testing

type WebSocketTestServer

type WebSocketTestServer struct {
	Server *httptest.Server
	Melody *melody.Melody

	Messages []WebSocketMessage
	// contains filtered or unexported fields
}

WebSocketTestServer provides utilities for testing WebSocket connections

func NewWebSocketTestServer

func NewWebSocketTestServer(t *testing.T, handler func(*melody.Session, []byte)) *WebSocketTestServer

NewWebSocketTestServer creates a new WebSocket test server

func (*WebSocketTestServer) ClearMessages

func (wsts *WebSocketTestServer) ClearMessages()

ClearMessages clears all recorded messages (thread-safe)

func (*WebSocketTestServer) Close

func (wsts *WebSocketTestServer) Close()

Close shuts down the test server

func (*WebSocketTestServer) CreateWebSocketClient

func (wsts *WebSocketTestServer) CreateWebSocketClient() (*websocket.Conn, error)

CreateWebSocketClient creates a WebSocket client connected to the test server

func (*WebSocketTestServer) GetMessages

func (wsts *WebSocketTestServer) GetMessages() []WebSocketMessage

GetMessages returns all recorded messages (thread-safe)

func (*WebSocketTestServer) WaitForMessages

func (wsts *WebSocketTestServer) WaitForMessages(count int, timeout time.Duration) error

WaitForMessages waits for a specific number of messages with timeout

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL