diff options
| -rw-r--r-- | hotline/ban.go | 74 | ||||
| -rw-r--r-- | hotline/chat.go | 37 | ||||
| -rw-r--r-- | hotline/client_manager.go | 25 | ||||
| -rw-r--r-- | hotline/file_store.go | 120 | ||||
| -rw-r--r-- | hotline/hltest/mocks.go | 319 | ||||
| -rw-r--r-- | hotline/mocks_test.go | 160 | ||||
| -rw-r--r-- | hotline/news.go | 52 | ||||
| -rw-r--r-- | internal/mobius/account_manager.go | 41 | ||||
| -rw-r--r-- | internal/mobius/handlers_accounts_test.go | 21 | ||||
| -rw-r--r-- | internal/mobius/handlers_chat_test.go | 93 | ||||
| -rw-r--r-- | internal/mobius/handlers_files_test.go | 73 | ||||
| -rw-r--r-- | internal/mobius/handlers_news_test.go | 57 | ||||
| -rw-r--r-- | internal/mobius/handlers_session_test.go | 67 | ||||
| -rw-r--r-- | internal/mobius/handlers_transfers_test.go | 4 | ||||
| -rw-r--r-- | internal/mobius/mocks_test.go | 48 |
15 files changed, 691 insertions, 500 deletions
diff --git a/hotline/ban.go b/hotline/ban.go index 43988ab..343c4ff 100644 --- a/hotline/ban.go +++ b/hotline/ban.go @@ -2,8 +2,6 @@ package hotline import ( "time" - - "github.com/stretchr/testify/mock" ) // BanDuration is the length of time for temporary bans. @@ -20,86 +18,22 @@ const ( type BanMgr interface { Add(ip string, until *time.Time) error IsBanned(ip string) (bool, *time.Time) - + // IP banning UnbanIP(ip string) error - + // Username banning BanUsername(username string) error UnbanUsername(username string) error IsUsernameBanned(username string) bool - + // Nickname banning BanNickname(nickname string) error UnbanNickname(nickname string) error IsNicknameBanned(nickname string) bool - + // List operations ListBannedIPs() ([]string, error) ListBannedUsernames() ([]string, error) ListBannedNicknames() ([]string, error) } - -type MockBanMgr struct { - mock.Mock -} - -func (m *MockBanMgr) Add(ip string, until *time.Time) error { - args := m.Called(ip, until) - return args.Error(0) -} - -func (m *MockBanMgr) IsBanned(ip string) (bool, *time.Time) { - args := m.Called(ip) - return args.Bool(0), args.Get(1).(*time.Time) -} - -func (m *MockBanMgr) UnbanIP(ip string) error { - args := m.Called(ip) - return args.Error(0) -} - -func (m *MockBanMgr) BanUsername(username string) error { - args := m.Called(username) - return args.Error(0) -} - -func (m *MockBanMgr) UnbanUsername(username string) error { - args := m.Called(username) - return args.Error(0) -} - -func (m *MockBanMgr) IsUsernameBanned(username string) bool { - args := m.Called(username) - return args.Bool(0) -} - -func (m *MockBanMgr) BanNickname(nickname string) error { - args := m.Called(nickname) - return args.Error(0) -} - -func (m *MockBanMgr) UnbanNickname(nickname string) error { - args := m.Called(nickname) - return args.Error(0) -} - -func (m *MockBanMgr) IsNicknameBanned(nickname string) bool { - args := m.Called(nickname) - return args.Bool(0) -} - -func (m *MockBanMgr) ListBannedIPs() ([]string, error) { - args := m.Called() - return args.Get(0).([]string), args.Error(1) -} - -func (m *MockBanMgr) ListBannedUsernames() ([]string, error) { - args := m.Called() - return args.Get(0).([]string), args.Error(1) -} - -func (m *MockBanMgr) ListBannedNicknames() ([]string, error) { - args := m.Called() - return args.Get(0).([]string), args.Error(1) -} diff --git a/hotline/chat.go b/hotline/chat.go index f35fac5..00ae8ea 100644 --- a/hotline/chat.go +++ b/hotline/chat.go @@ -4,8 +4,6 @@ import ( "crypto/rand" "slices" "sync" - - "github.com/stretchr/testify/mock" ) type PrivateChat struct { @@ -101,38 +99,3 @@ func (cm *MemChatManager) SetSubject(id ChatID, subject string) { chat.Subject = subject } - -type MockChatManager struct { - mock.Mock -} - -func (m *MockChatManager) New(cc *ClientConn) ChatID { - args := m.Called(cc) - - return args.Get(0).(ChatID) -} - -func (m *MockChatManager) GetSubject(id ChatID) string { - args := m.Called(id) - - return args.String(0) -} - -func (m *MockChatManager) Join(id ChatID, cc *ClientConn) { - m.Called(id, cc) -} - -func (m *MockChatManager) Leave(id ChatID, clientID [2]byte) { - m.Called(id, clientID) -} - -func (m *MockChatManager) SetSubject(id ChatID, subject string) { - m.Called(id, subject) - -} - -func (m *MockChatManager) Members(id ChatID) []*ClientConn { - args := m.Called(id) - - return args.Get(0).([]*ClientConn) -} diff --git a/hotline/client_manager.go b/hotline/client_manager.go index 22d096d..60f0388 100644 --- a/hotline/client_manager.go +++ b/hotline/client_manager.go @@ -6,8 +6,6 @@ import ( "slices" "sync" "sync/atomic" - - "github.com/stretchr/testify/mock" ) type ClientID [2]byte @@ -19,29 +17,6 @@ type ClientManager interface { Delete(id ClientID) } -type MockClientMgr struct { - mock.Mock -} - -func (m *MockClientMgr) List() []*ClientConn { - args := m.Called() - - return args.Get(0).([]*ClientConn) -} - -func (m *MockClientMgr) Get(id ClientID) *ClientConn { - args := m.Called(id) - - return args.Get(0).(*ClientConn) -} - -func (m *MockClientMgr) Add(cc *ClientConn) { - m.Called(cc) -} -func (m *MockClientMgr) Delete(id ClientID) { - m.Called(id) -} - type MemClientMgr struct { clients map[ClientID]*ClientConn diff --git a/hotline/file_store.go b/hotline/file_store.go index 8cf1403..735ff69 100644 --- a/hotline/file_store.go +++ b/hotline/file_store.go @@ -5,9 +5,6 @@ import ( "io/fs" "os" "path/filepath" - "time" - - "github.com/stretchr/testify/mock" ) // FileStore is the storage backend for the file library (the FileRoot that clients browse, @@ -111,120 +108,3 @@ func (*OSFileStore) OpenFile(name string, flag int, perm fs.FileMode) (io.WriteC } return f, nil } - -type MockFileStore struct { - mock.Mock -} - -var _ FileStore = (*MockFileStore)(nil) - -func (mfs *MockFileStore) Mkdir(name string, perm fs.FileMode) error { - args := mfs.Called(name, perm) - return args.Error(0) -} - -func (mfs *MockFileStore) Stat(name string) (fs.FileInfo, error) { - args := mfs.Called(name) - if args.Get(0) == nil { - return nil, args.Error(1) - } - return args.Get(0).(fs.FileInfo), args.Error(1) -} - -func (mfs *MockFileStore) Open(name string) (io.ReadCloser, error) { - args := mfs.Called(name) - f, _ := args.Get(0).(io.ReadCloser) - return f, args.Error(1) -} - -func (mfs *MockFileStore) ReadDir(name string) ([]fs.DirEntry, error) { - args := mfs.Called(name) - entries, _ := args.Get(0).([]fs.DirEntry) - return entries, args.Error(1) -} - -func (mfs *MockFileStore) ReadLink(name string) (string, error) { - args := mfs.Called(name) - return args.String(0), args.Error(1) -} - -func (mfs *MockFileStore) Walk(root string, fn filepath.WalkFunc) error { - args := mfs.Called(root, fn) - return args.Error(0) -} - -func (mfs *MockFileStore) OpenFile(name string, flag int, perm fs.FileMode) (io.WriteCloser, error) { - args := mfs.Called(name, flag, perm) - f, _ := args.Get(0).(io.WriteCloser) - return f, args.Error(1) -} - -func (mfs *MockFileStore) Symlink(oldname, newname string) error { - args := mfs.Called(oldname, newname) - return args.Error(0) -} - -func (mfs *MockFileStore) RemoveAll(name string) error { - args := mfs.Called(name) - return args.Error(0) -} - -func (mfs *MockFileStore) Remove(name string) error { - args := mfs.Called(name) - return args.Error(0) -} - -func (mfs *MockFileStore) Create(name string) (io.WriteCloser, error) { - args := mfs.Called(name) - f, _ := args.Get(0).(io.WriteCloser) - return f, args.Error(1) -} - -func (mfs *MockFileStore) WriteFile(name string, data []byte, perm fs.FileMode) error { - args := mfs.Called(name, data, perm) - return args.Error(0) -} - -func (mfs *MockFileStore) Rename(oldpath, newpath string) error { - args := mfs.Called(oldpath, newpath) - return args.Error(0) -} - -func (mfs *MockFileStore) ReadFile(name string) ([]byte, error) { - args := mfs.Called(name) - return args.Get(0).([]byte), args.Error(1) -} - -type MockFileInfo struct { - mock.Mock -} - -func (mfi *MockFileInfo) Name() string { - args := mfi.Called() - return args.String(0) -} - -func (mfi *MockFileInfo) Size() int64 { - args := mfi.Called() - return args.Get(0).(int64) -} - -func (mfi *MockFileInfo) Mode() fs.FileMode { - args := mfi.Called() - return args.Get(0).(fs.FileMode) -} - -func (mfi *MockFileInfo) ModTime() time.Time { - _ = mfi.Called() - return time.Now() -} - -func (mfi *MockFileInfo) IsDir() bool { - args := mfi.Called() - return args.Bool(0) -} - -func (mfi *MockFileInfo) Sys() interface{} { - _ = mfi.Called() - return nil -} diff --git a/hotline/hltest/mocks.go b/hotline/hltest/mocks.go new file mode 100644 index 0000000..2f9b9b1 --- /dev/null +++ b/hotline/hltest/mocks.go @@ -0,0 +1,319 @@ +// Package hltest provides testify mocks for the hotline package's manager interfaces, for use by +// tests in other packages (which cannot import another package's _test.go files). Keeping them +// here rather than in the hotline package itself keeps testify out of the production dependency +// graph of importers and the mocks out of the library's API surface. +// +// The hotline package's own in-package tests cannot import this package (it would create an import +// cycle through hotline) and instead use private copies in hotline/mocks_test.go. +package hltest + +import ( + "io" + "io/fs" + "path/filepath" + "time" + + "github.com/jhalter/mobius/hotline" + "github.com/stretchr/testify/mock" +) + +type MockFileStore struct { + mock.Mock +} + +var _ hotline.FileStore = (*MockFileStore)(nil) + +func (mfs *MockFileStore) Mkdir(name string, perm fs.FileMode) error { + args := mfs.Called(name, perm) + return args.Error(0) +} + +func (mfs *MockFileStore) Stat(name string) (fs.FileInfo, error) { + args := mfs.Called(name) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).(fs.FileInfo), args.Error(1) +} + +func (mfs *MockFileStore) Open(name string) (io.ReadCloser, error) { + args := mfs.Called(name) + f, _ := args.Get(0).(io.ReadCloser) + return f, args.Error(1) +} + +func (mfs *MockFileStore) ReadDir(name string) ([]fs.DirEntry, error) { + args := mfs.Called(name) + entries, _ := args.Get(0).([]fs.DirEntry) + return entries, args.Error(1) +} + +func (mfs *MockFileStore) ReadLink(name string) (string, error) { + args := mfs.Called(name) + return args.String(0), args.Error(1) +} + +func (mfs *MockFileStore) Walk(root string, fn filepath.WalkFunc) error { + args := mfs.Called(root, fn) + return args.Error(0) +} + +func (mfs *MockFileStore) OpenFile(name string, flag int, perm fs.FileMode) (io.WriteCloser, error) { + args := mfs.Called(name, flag, perm) + f, _ := args.Get(0).(io.WriteCloser) + return f, args.Error(1) +} + +func (mfs *MockFileStore) Symlink(oldname, newname string) error { + args := mfs.Called(oldname, newname) + return args.Error(0) +} + +func (mfs *MockFileStore) RemoveAll(name string) error { + args := mfs.Called(name) + return args.Error(0) +} + +func (mfs *MockFileStore) Remove(name string) error { + args := mfs.Called(name) + return args.Error(0) +} + +func (mfs *MockFileStore) Create(name string) (io.WriteCloser, error) { + args := mfs.Called(name) + f, _ := args.Get(0).(io.WriteCloser) + return f, args.Error(1) +} + +func (mfs *MockFileStore) WriteFile(name string, data []byte, perm fs.FileMode) error { + args := mfs.Called(name, data, perm) + return args.Error(0) +} + +func (mfs *MockFileStore) Rename(oldpath, newpath string) error { + args := mfs.Called(oldpath, newpath) + return args.Error(0) +} + +func (mfs *MockFileStore) ReadFile(name string) ([]byte, error) { + args := mfs.Called(name) + return args.Get(0).([]byte), args.Error(1) +} + +type MockFileInfo struct { + mock.Mock +} + +var _ fs.FileInfo = (*MockFileInfo)(nil) + +func (mfi *MockFileInfo) Name() string { + args := mfi.Called() + return args.String(0) +} + +func (mfi *MockFileInfo) Size() int64 { + args := mfi.Called() + return args.Get(0).(int64) +} + +func (mfi *MockFileInfo) Mode() fs.FileMode { + args := mfi.Called() + return args.Get(0).(fs.FileMode) +} + +func (mfi *MockFileInfo) ModTime() time.Time { + _ = mfi.Called() + return time.Now() +} + +func (mfi *MockFileInfo) IsDir() bool { + args := mfi.Called() + return args.Bool(0) +} + +func (mfi *MockFileInfo) Sys() interface{} { + _ = mfi.Called() + return nil +} + +type MockClientMgr struct { + mock.Mock +} + +var _ hotline.ClientManager = (*MockClientMgr)(nil) + +func (m *MockClientMgr) List() []*hotline.ClientConn { + args := m.Called() + + return args.Get(0).([]*hotline.ClientConn) +} + +func (m *MockClientMgr) Get(id hotline.ClientID) *hotline.ClientConn { + args := m.Called(id) + + return args.Get(0).(*hotline.ClientConn) +} + +func (m *MockClientMgr) Add(cc *hotline.ClientConn) { + m.Called(cc) +} + +func (m *MockClientMgr) Delete(id hotline.ClientID) { + m.Called(id) +} + +type MockBanMgr struct { + mock.Mock +} + +var _ hotline.BanMgr = (*MockBanMgr)(nil) + +func (m *MockBanMgr) Add(ip string, until *time.Time) error { + args := m.Called(ip, until) + return args.Error(0) +} + +func (m *MockBanMgr) IsBanned(ip string) (bool, *time.Time) { + args := m.Called(ip) + return args.Bool(0), args.Get(1).(*time.Time) +} + +func (m *MockBanMgr) UnbanIP(ip string) error { + args := m.Called(ip) + return args.Error(0) +} + +func (m *MockBanMgr) BanUsername(username string) error { + args := m.Called(username) + return args.Error(0) +} + +func (m *MockBanMgr) UnbanUsername(username string) error { + args := m.Called(username) + return args.Error(0) +} + +func (m *MockBanMgr) IsUsernameBanned(username string) bool { + args := m.Called(username) + return args.Bool(0) +} + +func (m *MockBanMgr) BanNickname(nickname string) error { + args := m.Called(nickname) + return args.Error(0) +} + +func (m *MockBanMgr) UnbanNickname(nickname string) error { + args := m.Called(nickname) + return args.Error(0) +} + +func (m *MockBanMgr) IsNicknameBanned(nickname string) bool { + args := m.Called(nickname) + return args.Bool(0) +} + +func (m *MockBanMgr) ListBannedIPs() ([]string, error) { + args := m.Called() + return args.Get(0).([]string), args.Error(1) +} + +func (m *MockBanMgr) ListBannedUsernames() ([]string, error) { + args := m.Called() + return args.Get(0).([]string), args.Error(1) +} + +func (m *MockBanMgr) ListBannedNicknames() ([]string, error) { + args := m.Called() + return args.Get(0).([]string), args.Error(1) +} + +type MockChatManager struct { + mock.Mock +} + +var _ hotline.ChatManager = (*MockChatManager)(nil) + +func (m *MockChatManager) New(cc *hotline.ClientConn) hotline.ChatID { + args := m.Called(cc) + + return args.Get(0).(hotline.ChatID) +} + +func (m *MockChatManager) GetSubject(id hotline.ChatID) string { + args := m.Called(id) + + return args.String(0) +} + +func (m *MockChatManager) Join(id hotline.ChatID, cc *hotline.ClientConn) { + m.Called(id, cc) +} + +func (m *MockChatManager) Leave(id hotline.ChatID, clientID [2]byte) { + m.Called(id, clientID) +} + +func (m *MockChatManager) SetSubject(id hotline.ChatID, subject string) { + m.Called(id, subject) +} + +func (m *MockChatManager) Members(id hotline.ChatID) []*hotline.ClientConn { + args := m.Called(id) + + return args.Get(0).([]*hotline.ClientConn) +} + +type MockThreadNewsMgr struct { + mock.Mock +} + +var _ hotline.ThreadedNewsMgr = (*MockThreadNewsMgr)(nil) + +func (m *MockThreadNewsMgr) ListArticles(newsPath []string) (hotline.NewsArtListData, error) { + args := m.Called(newsPath) + + return args.Get(0).(hotline.NewsArtListData), args.Error(1) +} + +func (m *MockThreadNewsMgr) GetArticle(newsPath []string, articleID uint32) *hotline.NewsArtData { + args := m.Called(newsPath, articleID) + + return args.Get(0).(*hotline.NewsArtData) +} + +func (m *MockThreadNewsMgr) DeleteArticle(newsPath []string, articleID uint32, recursive bool) error { + args := m.Called(newsPath, articleID, recursive) + + return args.Error(0) +} + +func (m *MockThreadNewsMgr) PostArticle(newsPath []string, parentArticleID uint32, article hotline.NewsArtData) error { + args := m.Called(newsPath, parentArticleID, article) + + return args.Error(0) +} + +func (m *MockThreadNewsMgr) CreateGrouping(newsPath []string, name string, itemType [2]byte) error { + args := m.Called(newsPath, name, itemType) + + return args.Error(0) +} + +func (m *MockThreadNewsMgr) GetCategories(paths []string) []hotline.NewsCategoryListData15 { + args := m.Called(paths) + + return args.Get(0).([]hotline.NewsCategoryListData15) +} + +func (m *MockThreadNewsMgr) NewsItem(newsPath []string) hotline.NewsCategoryListData15 { + args := m.Called(newsPath) + + return args.Get(0).(hotline.NewsCategoryListData15) +} + +func (m *MockThreadNewsMgr) DeleteNewsItem(newsPath []string) error { + args := m.Called(newsPath) + + return args.Error(0) +} diff --git a/hotline/mocks_test.go b/hotline/mocks_test.go new file mode 100644 index 0000000..bd17b3b --- /dev/null +++ b/hotline/mocks_test.go @@ -0,0 +1,160 @@ +package hotline + +// In-package copies of the mocks these tests need. They cannot use hotline/hltest — importing it +// from an in-package test would create an import cycle through hotline — so the mocks used by +// in-package tests live here. Cross-package consumers use hotline/hltest instead; keep the two in +// sync (the conformance assertions in both files catch signature drift). + +import ( + "io" + "io/fs" + "path/filepath" + "time" + + "github.com/stretchr/testify/mock" +) + +type MockFileStore struct { + mock.Mock +} + +var _ FileStore = (*MockFileStore)(nil) + +func (mfs *MockFileStore) Mkdir(name string, perm fs.FileMode) error { + args := mfs.Called(name, perm) + return args.Error(0) +} + +func (mfs *MockFileStore) Stat(name string) (fs.FileInfo, error) { + args := mfs.Called(name) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).(fs.FileInfo), args.Error(1) +} + +func (mfs *MockFileStore) Open(name string) (io.ReadCloser, error) { + args := mfs.Called(name) + f, _ := args.Get(0).(io.ReadCloser) + return f, args.Error(1) +} + +func (mfs *MockFileStore) ReadDir(name string) ([]fs.DirEntry, error) { + args := mfs.Called(name) + entries, _ := args.Get(0).([]fs.DirEntry) + return entries, args.Error(1) +} + +func (mfs *MockFileStore) ReadLink(name string) (string, error) { + args := mfs.Called(name) + return args.String(0), args.Error(1) +} + +func (mfs *MockFileStore) Walk(root string, fn filepath.WalkFunc) error { + args := mfs.Called(root, fn) + return args.Error(0) +} + +func (mfs *MockFileStore) OpenFile(name string, flag int, perm fs.FileMode) (io.WriteCloser, error) { + args := mfs.Called(name, flag, perm) + f, _ := args.Get(0).(io.WriteCloser) + return f, args.Error(1) +} + +func (mfs *MockFileStore) Symlink(oldname, newname string) error { + args := mfs.Called(oldname, newname) + return args.Error(0) +} + +func (mfs *MockFileStore) RemoveAll(name string) error { + args := mfs.Called(name) + return args.Error(0) +} + +func (mfs *MockFileStore) Remove(name string) error { + args := mfs.Called(name) + return args.Error(0) +} + +func (mfs *MockFileStore) Create(name string) (io.WriteCloser, error) { + args := mfs.Called(name) + f, _ := args.Get(0).(io.WriteCloser) + return f, args.Error(1) +} + +func (mfs *MockFileStore) WriteFile(name string, data []byte, perm fs.FileMode) error { + args := mfs.Called(name, data, perm) + return args.Error(0) +} + +func (mfs *MockFileStore) Rename(oldpath, newpath string) error { + args := mfs.Called(oldpath, newpath) + return args.Error(0) +} + +func (mfs *MockFileStore) ReadFile(name string) ([]byte, error) { + args := mfs.Called(name) + return args.Get(0).([]byte), args.Error(1) +} + +type MockFileInfo struct { + mock.Mock +} + +var _ fs.FileInfo = (*MockFileInfo)(nil) + +func (mfi *MockFileInfo) Name() string { + args := mfi.Called() + return args.String(0) +} + +func (mfi *MockFileInfo) Size() int64 { + args := mfi.Called() + return args.Get(0).(int64) +} + +func (mfi *MockFileInfo) Mode() fs.FileMode { + args := mfi.Called() + return args.Get(0).(fs.FileMode) +} + +func (mfi *MockFileInfo) ModTime() time.Time { + _ = mfi.Called() + return time.Now() +} + +func (mfi *MockFileInfo) IsDir() bool { + args := mfi.Called() + return args.Bool(0) +} + +func (mfi *MockFileInfo) Sys() interface{} { + _ = mfi.Called() + return nil +} + +type MockClientMgr struct { + mock.Mock +} + +var _ ClientManager = (*MockClientMgr)(nil) + +func (m *MockClientMgr) List() []*ClientConn { + args := m.Called() + + return args.Get(0).([]*ClientConn) +} + +func (m *MockClientMgr) Get(id ClientID) *ClientConn { + args := m.Called(id) + + return args.Get(0).(*ClientConn) +} + +func (m *MockClientMgr) Add(cc *ClientConn) { + m.Called(cc) +} + +func (m *MockClientMgr) Delete(id ClientID) { + m.Called(id) +} diff --git a/hotline/news.go b/hotline/news.go index 5e1d6e9..033badb 100644 --- a/hotline/news.go +++ b/hotline/news.go @@ -5,8 +5,6 @@ import ( "encoding/binary" "io" "slices" - - "github.com/stretchr/testify/mock" ) var ( @@ -362,53 +360,3 @@ func newsPathScanner(data []byte, _ bool) (advance int, token []byte, err error) advance = 3 + int(data[2]) return advance, data[3:advance], nil } - -type MockThreadNewsMgr struct { - mock.Mock -} - -func (m *MockThreadNewsMgr) ListArticles(newsPath []string) (NewsArtListData, error) { - args := m.Called(newsPath) - - return args.Get(0).(NewsArtListData), args.Error(1) -} - -func (m *MockThreadNewsMgr) GetArticle(newsPath []string, articleID uint32) *NewsArtData { - args := m.Called(newsPath, articleID) - - return args.Get(0).(*NewsArtData) -} -func (m *MockThreadNewsMgr) DeleteArticle(newsPath []string, articleID uint32, recursive bool) error { - args := m.Called(newsPath, articleID, recursive) - - return args.Error(0) -} - -func (m *MockThreadNewsMgr) PostArticle(newsPath []string, parentArticleID uint32, article NewsArtData) error { - args := m.Called(newsPath, parentArticleID, article) - - return args.Error(0) -} -func (m *MockThreadNewsMgr) CreateGrouping(newsPath []string, name string, itemType [2]byte) error { - args := m.Called(newsPath, name, itemType) - - return args.Error(0) -} - -func (m *MockThreadNewsMgr) GetCategories(paths []string) []NewsCategoryListData15 { - args := m.Called(paths) - - return args.Get(0).([]NewsCategoryListData15) -} - -func (m *MockThreadNewsMgr) NewsItem(newsPath []string) NewsCategoryListData15 { - args := m.Called(newsPath) - - return args.Get(0).(NewsCategoryListData15) -} - -func (m *MockThreadNewsMgr) DeleteNewsItem(newsPath []string) error { - args := m.Called(newsPath) - - return args.Error(0) -} diff --git a/internal/mobius/account_manager.go b/internal/mobius/account_manager.go index 44c054a..362f2c8 100644 --- a/internal/mobius/account_manager.go +++ b/internal/mobius/account_manager.go @@ -9,7 +9,6 @@ import ( "sync" "github.com/jhalter/mobius/hotline" - "github.com/stretchr/testify/mock" "gopkg.in/yaml.v3" ) @@ -172,43 +171,3 @@ func (am *YAMLAccountManager) Delete(login string) error { return nil } - -// MockAccountManager provides a test double implementation of AccountManager using testify/mock. -type MockAccountManager struct { - mock.Mock -} - -// Create mocks the Create method for testing. -func (m *MockAccountManager) Create(account hotline.Account) error { - args := m.Called(account) - - return args.Error(0) -} - -// Update mocks the Update method for testing. -func (m *MockAccountManager) Update(account hotline.Account, newLogin string) error { - args := m.Called(account, newLogin) - - return args.Error(0) -} - -// Get mocks the Get method for testing. -func (m *MockAccountManager) Get(login string) *hotline.Account { - args := m.Called(login) - - return args.Get(0).(*hotline.Account) -} - -// List mocks the List method for testing. -func (m *MockAccountManager) List() []hotline.Account { - args := m.Called() - - return args.Get(0).([]hotline.Account) -} - -// Delete mocks the Delete method for testing. -func (m *MockAccountManager) Delete(login string) error { - args := m.Called(login) - - return args.Error(0) -} diff --git a/internal/mobius/handlers_accounts_test.go b/internal/mobius/handlers_accounts_test.go index a7fe827..60b4f6e 100644 --- a/internal/mobius/handlers_accounts_test.go +++ b/internal/mobius/handlers_accounts_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/jhalter/mobius/hotline" + "github.com/jhalter/mobius/hotline/hltest" "github.com/stretchr/testify/mock" "golang.org/x/text/encoding/charmap" ) @@ -170,8 +171,8 @@ func TestHandleDeleteUser(t *testing.T) { m.On("Delete", "testuser").Return(nil) return &m }(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{}) // TODO return &m }(), @@ -240,8 +241,8 @@ func TestHandleDeleteUser(t *testing.T) { m.On("Delete", "testuser").Return(nil) return &m }(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{ { ID: [2]byte{0, 2}, @@ -302,8 +303,8 @@ func TestHandleDeleteUser(t *testing.T) { m.On("Delete", "testuser").Return(nil) return &m }(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{ { ID: [2]byte{0, 3}, @@ -776,8 +777,8 @@ func TestHandleUpdateUser(t *testing.T) { m.On("Delete", "testuser").Return(nil) return &m }(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{ { Account: &hotline.Account{ @@ -1313,8 +1314,8 @@ func TestHandleSetUser(t *testing.T) { m.On("Update", mock.Anything, "testuser").Return(nil) return &m }(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{}) return &m }(), diff --git a/internal/mobius/handlers_chat_test.go b/internal/mobius/handlers_chat_test.go index af16159..e3f6031 100644 --- a/internal/mobius/handlers_chat_test.go +++ b/internal/mobius/handlers_chat_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/jhalter/mobius/hotline" + "github.com/jhalter/mobius/hotline/hltest" "github.com/stretchr/testify/mock" "golang.org/x/text/encoding/charmap" ) @@ -26,8 +27,8 @@ func TestHandleSetChatSubject(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ChatMgr: func() *hotline.MockChatManager { - m := hotline.MockChatManager{} + ChatMgr: func() *hltest.MockChatManager { + m := hltest.MockChatManager{} m.On("Members", hotline.ChatID{0x0, 0x0, 0x0, 0x1}).Return([]*hotline.ClientConn{ { Account: &hotline.Account{ @@ -64,8 +65,8 @@ func TestHandleSetChatSubject(t *testing.T) { // }, // }, //}, - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{ { Account: &hotline.Account{ @@ -142,8 +143,8 @@ func TestHandleLeaveChat(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ChatMgr: func() *hotline.MockChatManager { - m := hotline.MockChatManager{} + ChatMgr: func() *hltest.MockChatManager { + m := hltest.MockChatManager{} m.On("Members", hotline.ChatID{0x0, 0x0, 0x0, 0x1}).Return([]*hotline.ClientConn{ { Account: &hotline.Account{ @@ -156,8 +157,8 @@ func TestHandleLeaveChat(t *testing.T) { m.On("GetSubject").Return("unset") return &m }(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("Get").Return([]*hotline.ClientConn{ { Account: &hotline.Account{ @@ -226,8 +227,8 @@ func TestHandleChatSend(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{ { Account: &hotline.Account{ @@ -289,8 +290,8 @@ func TestHandleChatSend(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{ { Account: &hotline.Account{ @@ -380,8 +381,8 @@ func TestHandleChatSend(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{ { Account: &hotline.Account{ @@ -444,8 +445,8 @@ func TestHandleChatSend(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{ { Account: &hotline.Account{ @@ -504,8 +505,8 @@ func TestHandleChatSend(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{ { Account: &hotline.Account{ @@ -558,8 +559,8 @@ func TestHandleChatSend(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ChatMgr: func() *hotline.MockChatManager { - m := hotline.MockChatManager{} + ChatMgr: func() *hltest.MockChatManager { + m := hltest.MockChatManager{} m.On("Members", hotline.ChatID{0x0, 0x0, 0x0, 0x1}).Return([]*hotline.ClientConn{ { ID: [2]byte{0, 1}, @@ -571,8 +572,8 @@ func TestHandleChatSend(t *testing.T) { m.On("GetSubject").Return("unset") return &m }(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{ { Account: &hotline.Account{ @@ -685,8 +686,8 @@ func TestHandleSendInstantMsg(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("Get", hotline.ClientID{0x0, 0x2}).Return(&hotline.ClientConn{ AutoReply: []byte(nil), Flags: [2]byte{0, 0}, @@ -735,8 +736,8 @@ func TestHandleSendInstantMsg(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("Get", hotline.ClientID{0x0, 0x2}).Return(&hotline.ClientConn{ Flags: [2]byte{0, 0}, ID: [2]byte{0, 2}, @@ -794,8 +795,8 @@ func TestHandleSendInstantMsg(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("Get", hotline.ClientID{0x0, 0x2}).Return(&hotline.ClientConn{ Flags: [2]byte{255, 255}, ID: [2]byte{0, 2}, @@ -889,16 +890,16 @@ func TestHandleInviteNewChat(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("Get", hotline.ClientID{0x0, 0x2}).Return(&hotline.ClientConn{ ID: [2]byte{0, 2}, UserName: []byte("UserB"), }) return &m }(), - ChatMgr: func() *hotline.MockChatManager { - m := hotline.MockChatManager{} + ChatMgr: func() *hltest.MockChatManager { + m := hltest.MockChatManager{} m.On("New", mock.AnythingOfType("*hotline.ClientConn")).Return(hotline.ChatID{0x52, 0xfd, 0xfc, 0x07}) return &m }(), @@ -950,8 +951,8 @@ func TestHandleInviteNewChat(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("Get", hotline.ClientID{0, 2}).Return(&hotline.ClientConn{ ID: [2]byte{0, 2}, Icon: []byte{0, 1}, @@ -960,8 +961,8 @@ func TestHandleInviteNewChat(t *testing.T) { }) return &m }(), - ChatMgr: func() *hotline.MockChatManager { - m := hotline.MockChatManager{} + ChatMgr: func() *hltest.MockChatManager { + m := hltest.MockChatManager{} m.On("New", mock.AnythingOfType("*hotline.ClientConn")).Return(hotline.ChatID{0x52, 0xfd, 0xfc, 0x07}) return &m }(), @@ -1031,8 +1032,8 @@ func TestHandleJoinChat(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ChatMgr: func() *hotline.MockChatManager { - m := hotline.MockChatManager{} + ChatMgr: func() *hltest.MockChatManager { + m := hltest.MockChatManager{} // Mock existing members before join m.On("Members", hotline.ChatID{0, 0, 0, 1}).Return([]*hotline.ClientConn{ { @@ -1149,8 +1150,8 @@ func TestHandleJoinChat(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ChatMgr: func() *hotline.MockChatManager { - m := hotline.MockChatManager{} + ChatMgr: func() *hltest.MockChatManager { + m := hltest.MockChatManager{} // Mock empty chat before join m.On("Members", hotline.ChatID{0, 0, 0, 2}).Return([]*hotline.ClientConn{}) // Mock join operation @@ -1220,8 +1221,8 @@ func TestHandleRejectChatInvite(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ChatMgr: func() *hotline.MockChatManager { - m := hotline.MockChatManager{} + ChatMgr: func() *hltest.MockChatManager { + m := hltest.MockChatManager{} // Mock current members of the chat m.On("Members", hotline.ChatID{0, 0, 0, 1}).Return([]*hotline.ClientConn{ { @@ -1273,8 +1274,8 @@ func TestHandleRejectChatInvite(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ChatMgr: func() *hotline.MockChatManager { - m := hotline.MockChatManager{} + ChatMgr: func() *hltest.MockChatManager { + m := hltest.MockChatManager{} // Mock empty chat (no members) m.On("Members", hotline.ChatID{0, 0, 0, 2}).Return([]*hotline.ClientConn{}) return &m @@ -1302,8 +1303,8 @@ func TestHandleRejectChatInvite(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ChatMgr: func() *hotline.MockChatManager { - m := hotline.MockChatManager{} + ChatMgr: func() *hltest.MockChatManager { + m := hltest.MockChatManager{} // Mock chat with single member m.On("Members", hotline.ChatID{0, 0, 0, 3}).Return([]*hotline.ClientConn{ { diff --git a/internal/mobius/handlers_files_test.go b/internal/mobius/handlers_files_test.go index fd022bb..4aa52e1 100644 --- a/internal/mobius/handlers_files_test.go +++ b/internal/mobius/handlers_files_test.go @@ -12,6 +12,7 @@ import ( "time" "github.com/jhalter/mobius/hotline" + "github.com/jhalter/mobius/hotline/hltest" "golang.org/x/text/encoding/charmap" ) @@ -177,8 +178,8 @@ func TestHandleNewFolder(t *testing.T) { Config: hotline.Config{ FileRoot: "/Files/", }, - FS: func() *hotline.MockFileStore { - mfs := &hotline.MockFileStore{} + FS: func() *hltest.MockFileStore { + mfs := &hltest.MockFileStore{} mfs.On("Mkdir", "/Files/aaa/testFolder", fs.FileMode(0777)).Return(nil) mfs.On("Stat", "/Files/aaa/testFolder").Return(nil, os.ErrNotExist) return mfs @@ -221,8 +222,8 @@ func TestHandleNewFolder(t *testing.T) { Config: hotline.Config{ FileRoot: "/Files", }, - FS: func() *hotline.MockFileStore { - mfs := &hotline.MockFileStore{} + FS: func() *hltest.MockFileStore { + mfs := &hltest.MockFileStore{} mfs.On("Mkdir", "/Files/testFolder", fs.FileMode(0777)).Return(nil) mfs.On("Stat", "/Files/testFolder").Return(nil, os.ErrNotExist) return mfs @@ -260,8 +261,8 @@ func TestHandleNewFolder(t *testing.T) { Config: hotline.Config{ FileRoot: "/Files/", }, - FS: func() *hotline.MockFileStore { - mfs := &hotline.MockFileStore{} + FS: func() *hltest.MockFileStore { + mfs := &hltest.MockFileStore{} mfs.On("Mkdir", "/Files/aaa/testFolder", fs.FileMode(0777)).Return(nil) mfs.On("Stat", "/Files/aaa/testFolder").Return(nil, os.ErrNotExist) return mfs @@ -305,8 +306,8 @@ func TestHandleNewFolder(t *testing.T) { Config: hotline.Config{ FileRoot: "/Files/", }, - FS: func() *hotline.MockFileStore { - mfs := &hotline.MockFileStore{} + FS: func() *hltest.MockFileStore { + mfs := &hltest.MockFileStore{} mfs.On("Mkdir", "/Files/testFolder", fs.FileMode(0777)).Return(nil) mfs.On("Stat", "/Files/testFolder").Return(nil, os.ErrNotExist) return mfs @@ -343,8 +344,8 @@ func TestHandleNewFolder(t *testing.T) { Config: hotline.Config{ FileRoot: "/Files/", }, - FS: func() *hotline.MockFileStore { - mfs := &hotline.MockFileStore{} + FS: func() *hltest.MockFileStore { + mfs := &hltest.MockFileStore{} mfs.On("Mkdir", "/Files/foo/testFolder", fs.FileMode(0777)).Return(nil) mfs.On("Stat", "/Files/foo/testFolder").Return(nil, os.ErrNotExist) return mfs @@ -416,8 +417,8 @@ func TestHandleMakeAlias(t *testing.T) { }(), }, Logger: NewTestLogger(), - FS: func() *hotline.MockFileStore { - mfs := &hotline.MockFileStore{} + FS: func() *hltest.MockFileStore { + mfs := &hltest.MockFileStore{} path, _ := os.Getwd() mfs.On( "Symlink", @@ -464,8 +465,8 @@ func TestHandleMakeAlias(t *testing.T) { }(), }, Logger: NewTestLogger(), - FS: func() *hotline.MockFileStore { - mfs := &hotline.MockFileStore{} + FS: func() *hltest.MockFileStore { + mfs := &hltest.MockFileStore{} path, _ := os.Getwd() mfs.On( "Symlink", @@ -576,15 +577,15 @@ func TestHandleDeleteFile(t *testing.T) { return "/fakeRoot/Files" }(), }, - FS: func() *hotline.MockFileStore { - mfi := &hotline.MockFileInfo{} + FS: func() *hltest.MockFileStore { + mfi := &hltest.MockFileInfo{} mfi.On("Mode").Return(fs.FileMode(0)) mfi.On("Size").Return(int64(100)) mfi.On("ModTime").Return(time.Parse(time.Layout, time.Layout)) mfi.On("IsDir").Return(false) mfi.On("Name").Return("testfile") - mfs := &hotline.MockFileStore{} + mfs := &hltest.MockFileStore{} mfs.On("Stat", "/fakeRoot/Files/aaa/testfile").Return(mfi, nil) mfs.On("Stat", "/fakeRoot/Files/aaa/.info_testfile").Return(nil, errors.New("err")) mfs.On("Stat", "/fakeRoot/Files/aaa/.rsrc_testfile").Return(nil, errors.New("err")) @@ -634,15 +635,15 @@ func TestHandleDeleteFile(t *testing.T) { return "/fakeRoot/Files" }(), }, - FS: func() *hotline.MockFileStore { - mfi := &hotline.MockFileInfo{} + FS: func() *hltest.MockFileStore { + mfi := &hltest.MockFileInfo{} mfi.On("Mode").Return(fs.FileMode(0)) mfi.On("Size").Return(int64(100)) mfi.On("ModTime").Return(time.Parse(time.Layout, time.Layout)) mfi.On("IsDir").Return(false) mfi.On("Name").Return("testfile") - mfs := &hotline.MockFileStore{} + mfs := &hltest.MockFileStore{} mfs.On("Stat", "/fakeRoot/Files/aaa/testfile").Return(mfi, nil) mfs.On("Stat", "/fakeRoot/Files/aaa/.info_testfile").Return(nil, errors.New("err")) mfs.On("Stat", "/fakeRoot/Files/aaa/.rsrc_testfile").Return(nil, errors.New("err")) @@ -681,7 +682,7 @@ func TestHandleDeleteFile(t *testing.T) { gotRes := HandleDeleteFile(tt.args.cc, &tt.args.t) TranAssertEqual(t, tt.wantRes, gotRes) - tt.args.cc.Server.FS.(*hotline.MockFileStore).AssertExpectations(t) + tt.args.cc.Server.FS.(*hltest.MockFileStore).AssertExpectations(t) }) } } @@ -821,15 +822,15 @@ func TestHandleMoveFile(t *testing.T) { Config: hotline.Config{ FileRoot: "/fakeRoot/Files", }, - FS: func() *hotline.MockFileStore { - mfi := &hotline.MockFileInfo{} + FS: func() *hltest.MockFileStore { + mfi := &hltest.MockFileInfo{} mfi.On("Mode").Return(fs.FileMode(0)) mfi.On("Size").Return(int64(100)) mfi.On("ModTime").Return(time.Parse(time.Layout, time.Layout)) mfi.On("IsDir").Return(false) mfi.On("Name").Return("testfile") - mfs := &hotline.MockFileStore{} + mfs := &hltest.MockFileStore{} // NewFile calls: Stat data, Stat info, Stat rsrc mfs.On("Stat", "/fakeRoot/Files/aaa/testfile").Return(mfi, nil) mfs.On("Stat", "/fakeRoot/Files/aaa/.info_testfile").Return(nil, errors.New("err")) @@ -885,15 +886,15 @@ func TestHandleMoveFile(t *testing.T) { Config: hotline.Config{ FileRoot: "/fakeRoot/Files", }, - FS: func() *hotline.MockFileStore { - mfi := &hotline.MockFileInfo{} + FS: func() *hltest.MockFileStore { + mfi := &hltest.MockFileInfo{} mfi.On("Mode").Return(fs.ModeDir) mfi.On("Size").Return(int64(0)) mfi.On("ModTime").Return(time.Parse(time.Layout, time.Layout)) mfi.On("IsDir").Return(true) mfi.On("Name").Return("testfolder") - mfs := &hotline.MockFileStore{} + mfs := &hltest.MockFileStore{} mfs.On("Stat", "/fakeRoot/Files/aaa/testfolder").Return(mfi, nil) mfs.On("Stat", "/fakeRoot/Files/aaa/.info_testfolder").Return(nil, errors.New("err")) mfs.On("Stat", "/fakeRoot/Files/aaa/.rsrc_testfolder").Return(nil, errors.New("err")) @@ -966,15 +967,15 @@ func TestHandleSetFileInfo(t *testing.T) { Config: hotline.Config{ FileRoot: "/fakeRoot/Files", }, - FS: func() *hotline.MockFileStore { - mfi := &hotline.MockFileInfo{} + FS: func() *hltest.MockFileStore { + mfi := &hltest.MockFileInfo{} mfi.On("Mode").Return(fs.FileMode(0)) mfi.On("Size").Return(int64(100)) mfi.On("ModTime").Return(time.Parse(time.Layout, time.Layout)) mfi.On("IsDir").Return(false) mfi.On("Name").Return("testfile") - mfs := &hotline.MockFileStore{} + mfs := &hltest.MockFileStore{} mfs.On("Stat", "/fakeRoot/Files/testfile").Return(mfi, nil) mfs.On("Stat", "/fakeRoot/Files/.info_testfile").Return(nil, errors.New("err")) mfs.On("Stat", "/fakeRoot/Files/.rsrc_testfile").Return(nil, errors.New("err")) @@ -1018,15 +1019,15 @@ func TestHandleSetFileInfo(t *testing.T) { Config: hotline.Config{ FileRoot: "/fakeRoot/Files", }, - FS: func() *hotline.MockFileStore { - mfi := &hotline.MockFileInfo{} + FS: func() *hltest.MockFileStore { + mfi := &hltest.MockFileInfo{} mfi.On("Mode").Return(fs.FileMode(0)) mfi.On("Size").Return(int64(100)) mfi.On("ModTime").Return(time.Parse(time.Layout, time.Layout)) mfi.On("IsDir").Return(false) mfi.On("Name").Return("testfile") - mfs := &hotline.MockFileStore{} + mfs := &hltest.MockFileStore{} mfs.On("Stat", "/fakeRoot/Files/testfile").Return(mfi, nil) mfs.On("Stat", "/fakeRoot/Files/.info_testfile").Return(nil, errors.New("err")) mfs.On("Stat", "/fakeRoot/Files/.rsrc_testfile").Return(nil, errors.New("err")) @@ -1070,15 +1071,15 @@ func TestHandleSetFileInfo(t *testing.T) { Config: hotline.Config{ FileRoot: "/fakeRoot/Files", }, - FS: func() *hotline.MockFileStore { - mfi := &hotline.MockFileInfo{} + FS: func() *hltest.MockFileStore { + mfi := &hltest.MockFileInfo{} mfi.On("Mode").Return(fs.ModeDir) mfi.On("Size").Return(int64(0)) mfi.On("ModTime").Return(time.Parse(time.Layout, time.Layout)) mfi.On("IsDir").Return(true) mfi.On("Name").Return("testfolder") - mfs := &hotline.MockFileStore{} + mfs := &hltest.MockFileStore{} mfs.On("Stat", "/fakeRoot/Files/testfolder").Return(mfi, nil) mfs.On("Stat", "/fakeRoot/Files/.info_testfolder").Return(nil, errors.New("err")) mfs.On("Stat", "/fakeRoot/Files/.rsrc_testfolder").Return(nil, errors.New("err")) diff --git a/internal/mobius/handlers_news_test.go b/internal/mobius/handlers_news_test.go index 3e5125e..2b54c84 100644 --- a/internal/mobius/handlers_news_test.go +++ b/internal/mobius/handlers_news_test.go @@ -8,6 +8,7 @@ import ( "testing" "github.com/jhalter/mobius/hotline" + "github.com/jhalter/mobius/hotline/hltest" "github.com/stretchr/testify/mock" "golang.org/x/text/encoding/charmap" ) @@ -185,8 +186,8 @@ func TestHandleDelNewsArt(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ThreadedNewsMgr: func() *hotline.MockThreadNewsMgr { - m := hotline.MockThreadNewsMgr{} + ThreadedNewsMgr: func() *hltest.MockThreadNewsMgr { + m := hltest.MockThreadNewsMgr{} m.On("DeleteArticle", []string{"test"}, uint32(1), false).Return(errors.New("write error")) return &m }(), @@ -274,8 +275,8 @@ func TestHandleDelNewsItem(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ThreadedNewsMgr: func() *hotline.MockThreadNewsMgr { - m := hotline.MockThreadNewsMgr{} + ThreadedNewsMgr: func() *hltest.MockThreadNewsMgr { + m := hltest.MockThreadNewsMgr{} m.On("NewsItem", []string{"test"}).Return(hotline.NewsCategoryListData15{ Type: hotline.NewsCategory, }) @@ -317,8 +318,8 @@ func TestHandleDelNewsItem(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ThreadedNewsMgr: func() *hotline.MockThreadNewsMgr { - m := hotline.MockThreadNewsMgr{} + ThreadedNewsMgr: func() *hltest.MockThreadNewsMgr { + m := hltest.MockThreadNewsMgr{} m.On("NewsItem", []string{"test"}).Return(hotline.NewsCategoryListData15{ Type: hotline.NewsBundle, }) @@ -364,8 +365,8 @@ func TestHandleDelNewsItem(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ThreadedNewsMgr: func() *hotline.MockThreadNewsMgr { - m := hotline.MockThreadNewsMgr{} + ThreadedNewsMgr: func() *hltest.MockThreadNewsMgr { + m := hltest.MockThreadNewsMgr{} m.On("NewsItem", []string{"test"}).Return(hotline.NewsCategoryListData15{Type: hotline.NewsBundle}) m.On("DeleteNewsItem", []string{"test"}).Return(nil) return &m @@ -452,8 +453,8 @@ func TestHandleTranOldPostNews(t *testing.T) { Config: hotline.Config{ NewsDateFormat: "", }, - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{}) return &m }(), @@ -532,8 +533,8 @@ func TestHandleGetNewsArtData(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ThreadedNewsMgr: func() *hotline.MockThreadNewsMgr { - m := hotline.MockThreadNewsMgr{} + ThreadedNewsMgr: func() *hltest.MockThreadNewsMgr { + m := hltest.MockThreadNewsMgr{} m.On("GetArticle", []string{"Example Category"}, uint32(1)).Return(&hotline.NewsArtData{ Title: "title", Poster: "poster", @@ -640,8 +641,8 @@ func TestHandleGetNewsArtNameList(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ThreadedNewsMgr: func() *hotline.MockThreadNewsMgr { - m := hotline.MockThreadNewsMgr{} + ThreadedNewsMgr: func() *hltest.MockThreadNewsMgr { + m := hltest.MockThreadNewsMgr{} m.On("ListArticles", []string{"Example Category"}).Return(hotline.NewsArtListData{ Name: []byte{}, Description: []byte{}, @@ -741,8 +742,8 @@ func TestHandleNewNewsFldr(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ThreadedNewsMgr: func() *hotline.MockThreadNewsMgr { - m := hotline.MockThreadNewsMgr{} + ThreadedNewsMgr: func() *hltest.MockThreadNewsMgr { + m := hltest.MockThreadNewsMgr{} m.On("CreateGrouping", []string{"test"}, "testFolder", hotline.NewsBundle).Return(nil) return &m }(), @@ -785,8 +786,8 @@ func TestHandleNewNewsFldr(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ThreadedNewsMgr: func() *hotline.MockThreadNewsMgr { - m := hotline.MockThreadNewsMgr{} + ThreadedNewsMgr: func() *hltest.MockThreadNewsMgr { + m := hltest.MockThreadNewsMgr{} m.On("CreateGrouping", []string{"test"}, "testFolder", hotline.NewsBundle).Return(errors.New("write error")) return &m }(), @@ -869,8 +870,8 @@ func TestHandlePostNewsArt(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ThreadedNewsMgr: func() *hotline.MockThreadNewsMgr { - m := hotline.MockThreadNewsMgr{} + ThreadedNewsMgr: func() *hltest.MockThreadNewsMgr { + m := hltest.MockThreadNewsMgr{} m.On("PostArticle", []string{"www"}, uint32(0), mock.AnythingOfType("hotline.NewsArtData")).Return(nil) return &m }(), @@ -905,8 +906,8 @@ func TestHandlePostNewsArt(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ThreadedNewsMgr: func() *hotline.MockThreadNewsMgr { - m := hotline.MockThreadNewsMgr{} + ThreadedNewsMgr: func() *hltest.MockThreadNewsMgr { + m := hltest.MockThreadNewsMgr{} m.On("PostArticle", []string{"www"}, uint32(0), mock.AnythingOfType("hotline.NewsArtData")).Return(errors.New("write error")) return &m }(), @@ -999,8 +1000,8 @@ func TestHandleNewNewsCat(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ThreadedNewsMgr: func() *hotline.MockThreadNewsMgr { - m := hotline.MockThreadNewsMgr{} + ThreadedNewsMgr: func() *hltest.MockThreadNewsMgr { + m := hltest.MockThreadNewsMgr{} m.On("CreateGrouping", []string{"test"}, "TestCat", hotline.NewsCategory).Return(errors.New("write error")) return &m }(), @@ -1046,8 +1047,8 @@ func TestHandleNewNewsCat(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ThreadedNewsMgr: func() *hotline.MockThreadNewsMgr { - m := hotline.MockThreadNewsMgr{} + ThreadedNewsMgr: func() *hltest.MockThreadNewsMgr { + m := hltest.MockThreadNewsMgr{} m.On("CreateGrouping", []string{"test"}, "TestCat", hotline.NewsCategory).Return(nil) return &m }(), @@ -1128,8 +1129,8 @@ func TestHandleGetNewsCatNameList(t *testing.T) { ID: [2]byte{0, 1}, Logger: slog.New(slog.NewTextHandler(os.Stdout, nil)), Server: &hotline.Server{ - ThreadedNewsMgr: func() *hotline.MockThreadNewsMgr { - m := hotline.MockThreadNewsMgr{} + ThreadedNewsMgr: func() *hltest.MockThreadNewsMgr { + m := hltest.MockThreadNewsMgr{} m.On("GetCategories", []string{}).Return([]hotline.NewsCategoryListData15{ { Type: hotline.NewsBundle, diff --git a/internal/mobius/handlers_session_test.go b/internal/mobius/handlers_session_test.go index bffc81c..ea96def 100644 --- a/internal/mobius/handlers_session_test.go +++ b/internal/mobius/handlers_session_test.go @@ -6,6 +6,7 @@ import ( "time" "github.com/jhalter/mobius/hotline" + "github.com/jhalter/mobius/hotline/hltest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "golang.org/x/text/encoding/charmap" @@ -29,8 +30,8 @@ func TestHandleGetUserNameList(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{ { ID: [2]byte{0, 1}, @@ -121,8 +122,8 @@ func TestHandleDisconnectUser(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("Get", hotline.ClientID{0x0, 0x1}).Return(&hotline.ClientConn{ Account: &hotline.Account{ Login: "unnamed", @@ -169,8 +170,8 @@ func TestHandleDisconnectUser(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("Get", hotline.ClientID{0x0, 0x1}).Return(&hotline.ClientConn{ ID: hotline.ClientID{0x0, 0x1}, UserName: []byte("baduser"), @@ -190,8 +191,8 @@ func TestHandleDisconnectUser(t *testing.T) { }) return &m }(), - BanList: func() *hotline.MockBanMgr { - m := hotline.MockBanMgr{} + BanList: func() *hltest.MockBanMgr { + m := hltest.MockBanMgr{} m.On("Add", "10.0.0.1", mock.AnythingOfType("*time.Time")).Return(nil) return &m }(), @@ -233,8 +234,8 @@ func TestHandleDisconnectUser(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("Get", hotline.ClientID{0x0, 0x1}).Return(&hotline.ClientConn{ ID: hotline.ClientID{0x0, 0x1}, UserName: []byte("baduser"), @@ -254,8 +255,8 @@ func TestHandleDisconnectUser(t *testing.T) { }) return &m }(), - BanList: func() *hotline.MockBanMgr { - m := hotline.MockBanMgr{} + BanList: func() *hltest.MockBanMgr { + m := hltest.MockBanMgr{} m.On("Add", "10.0.0.2", (*time.Time)(nil)).Return(nil) return &m }(), @@ -357,8 +358,8 @@ func TestHandleGetClientInfoText(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("Get", hotline.ClientID{0x0, 0x1}).Return(&hotline.ClientConn{ UserName: []byte("Testy McTest"), RemoteAddr: "1.2.3.4:12345", @@ -461,8 +462,8 @@ func TestHandleTranAgreed(t *testing.T) { Config: hotline.Config{ BannerFile: "Banner.jpg", }, - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{ //{ // ID: [2]byte{0, 2}, @@ -518,8 +519,8 @@ func TestHandleTranAgreed(t *testing.T) { Config: hotline.Config{ BannerFile: "Banner.gif", }, - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{}) return &m }(), @@ -582,8 +583,8 @@ func TestHandleSetClientUserInfo(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{ { ID: [2]byte{0, 1}, @@ -628,8 +629,8 @@ func TestHandleSetClientUserInfo(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{ { ID: [2]byte{0, 1}, @@ -672,8 +673,8 @@ func TestHandleSetClientUserInfo(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{ { ID: [2]byte{0, 1}, @@ -716,8 +717,8 @@ func TestHandleSetClientUserInfo(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{ { ID: [2]byte{0, 1}, @@ -761,8 +762,8 @@ func TestHandleSetClientUserInfo(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{ { ID: [2]byte{0, 1}, @@ -807,8 +808,8 @@ func TestHandleSetClientUserInfo(t *testing.T) { Server: &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), TextEncoder: charmap.Macintosh.NewEncoder(), - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{ { ID: [2]byte{0, 1}, @@ -905,8 +906,8 @@ func TestHandleUserBroadcast(t *testing.T) { }, ID: [2]byte{0, 1}, Server: &hotline.Server{ - ClientMgr: func() *hotline.MockClientMgr { - m := hotline.MockClientMgr{} + ClientMgr: func() *hltest.MockClientMgr { + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{}) return &m }(), @@ -960,7 +961,7 @@ func (f *fakePresenceTracker) UserDisconnected(login, nickname, ip string) { } func newPresenceTestServer(presence hotline.PresenceTracker) *hotline.Server { - m := hotline.MockClientMgr{} + m := hltest.MockClientMgr{} m.On("List").Return([]*hotline.ClientConn{}) return &hotline.Server{ TextDecoder: charmap.Macintosh.NewDecoder(), diff --git a/internal/mobius/handlers_transfers_test.go b/internal/mobius/handlers_transfers_test.go index 4e4ba0f..edd017f 100644 --- a/internal/mobius/handlers_transfers_test.go +++ b/internal/mobius/handlers_transfers_test.go @@ -244,14 +244,14 @@ func TestHandleDownloadFile(t *testing.T) { TextEncoder: charmap.Macintosh.NewEncoder(), FS: &hotline.OSFileStore{}, - // FS: func() *hotline.MockFileStore { + // FS: func() *hltest.MockFileStore { // path, _ := os.Getwd() // testFile, err := os.Open(path + "/test/config/Files/testfile-1k") // if err != nil { // panic(err) // } // - // mfi := &hotline.MockFileInfo{} + // mfi := &hltest.MockFileInfo{} // mfi.On("Mode").Return(fs.FileMode(0)) // mfs := &MockFileStore{} // mfs.On("Stat", "/fakeRoot/Files/testfile.txt").Return(mfi, nil) diff --git a/internal/mobius/mocks_test.go b/internal/mobius/mocks_test.go new file mode 100644 index 0000000..07250fb --- /dev/null +++ b/internal/mobius/mocks_test.go @@ -0,0 +1,48 @@ +package mobius + +import ( + "github.com/jhalter/mobius/hotline" + "github.com/stretchr/testify/mock" +) + +// MockAccountManager provides a test double implementation of AccountManager using testify/mock. +type MockAccountManager struct { + mock.Mock +} + +var _ hotline.AccountManager = (*MockAccountManager)(nil) + +// Create mocks the Create method for testing. +func (m *MockAccountManager) Create(account hotline.Account) error { + args := m.Called(account) + + return args.Error(0) +} + +// Update mocks the Update method for testing. +func (m *MockAccountManager) Update(account hotline.Account, newLogin string) error { + args := m.Called(account, newLogin) + + return args.Error(0) +} + +// Get mocks the Get method for testing. +func (m *MockAccountManager) Get(login string) *hotline.Account { + args := m.Called(login) + + return args.Get(0).(*hotline.Account) +} + +// List mocks the List method for testing. +func (m *MockAccountManager) List() []hotline.Account { + args := m.Called() + + return args.Get(0).([]hotline.Account) +} + +// Delete mocks the Delete method for testing. +func (m *MockAccountManager) Delete(login string) error { + args := m.Called(login) + + return args.Error(0) +} |