5 "github.com/stretchr/testify/mock"
13 type AccountManager interface {
14 Create(account Account) error
15 Update(account Account, newLogin string) error
16 Get(login string) *Account
18 Delete(login string) error
21 type YAMLAccountManager struct {
22 accounts map[string]Account
28 func NewYAMLAccountManager(accountDir string) (*YAMLAccountManager, error) {
29 accountMgr := YAMLAccountManager{
30 accountDir: accountDir,
31 accounts: make(map[string]Account),
34 matches, err := filepath.Glob(filepath.Join(accountDir, "*.yaml"))
39 if len(matches) == 0 {
40 return nil, fmt.Errorf("no accounts found in directory: %s", accountDir)
43 for _, file := range matches {
45 if err = loadFromYAMLFile(file, &account); err != nil {
46 return nil, fmt.Errorf("error loading account %s: %w", file, err)
49 accountMgr.accounts[account.Login] = account
52 return &accountMgr, nil
55 func (am *YAMLAccountManager) Create(account Account) error {
59 // Create account file, returning an error if one already exists.
60 file, err := os.OpenFile(
61 filepath.Join(am.accountDir, path.Join("/", account.Login+".yaml")),
62 os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0644,
65 return fmt.Errorf("error creating account file: %w", err)
69 b, err := yaml.Marshal(account)
71 return fmt.Errorf("marshal account to YAML: %v", err)
74 _, err = file.Write(b)
76 return fmt.Errorf("write account file: %w", err)
79 am.accounts[account.Login] = account
84 func (am *YAMLAccountManager) Update(account Account, newLogin string) error {
88 // If the login has changed, rename the account file.
89 if account.Login != newLogin {
91 filepath.Join(am.accountDir, path.Join("/", account.Login)+".yaml"),
92 filepath.Join(am.accountDir, path.Join("/", newLogin)+".yaml"),
95 return fmt.Errorf("error renaming account file: %w", err)
98 account.Login = newLogin
99 am.accounts[newLogin] = account
101 delete(am.accounts, account.Login)
104 out, err := yaml.Marshal(&account)
109 if err := os.WriteFile(filepath.Join(am.accountDir, newLogin+".yaml"), out, 0644); err != nil {
110 return fmt.Errorf("error writing account file: %w", err)
113 am.accounts[account.Login] = account
118 func (am *YAMLAccountManager) Get(login string) *Account {
122 account, ok := am.accounts[login]
130 func (am *YAMLAccountManager) List() []Account {
134 var accounts []Account
135 for _, account := range am.accounts {
136 accounts = append(accounts, account)
142 func (am *YAMLAccountManager) Delete(login string) error {
146 err := os.Remove(filepath.Join(am.accountDir, path.Join("/", login+".yaml")))
148 return fmt.Errorf("delete account file: %v", err)
151 delete(am.accounts, login)
156 type MockAccountManager struct {
160 func (m *MockAccountManager) Create(account Account) error {
161 args := m.Called(account)
166 func (m *MockAccountManager) Update(account Account, newLogin string) error {
167 args := m.Called(account, newLogin)
172 func (m *MockAccountManager) Get(login string) *Account {
173 args := m.Called(login)
175 return args.Get(0).(*Account)
178 func (m *MockAccountManager) List() []Account {
181 return args.Get(0).([]Account)
184 func (m *MockAccountManager) Delete(login string) error {
185 args := m.Called(login)