--- /dev/null
+package test
+
+import (
+ "io/ioutil"
+ "os"
+ "strings"
+ "testing"
+
+ acc "github.com/vapor/account"
+ "github.com/vapor/blockchain/signers"
+ "github.com/vapor/config"
+ "github.com/vapor/crypto/ed25519/chainkd"
+ "github.com/vapor/database"
+ dbm "github.com/vapor/database/leveldb"
+ "github.com/vapor/errors"
+ "github.com/vapor/event"
+ "github.com/vapor/protocol"
+ "github.com/vapor/testutil"
+)
+
+func TestCreateAccountWithUppercase(t *testing.T) {
+ m := mockAccountManager(t)
+ alias := "UPPER"
+ account, err := m.Manager.Create([]chainkd.XPub{testutil.TestXPub}, 1, alias, signers.BIP0044)
+
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if account.Alias != strings.ToLower(alias) {
+ t.Fatal("created account alias should be lowercase")
+ }
+}
+
+func TestCreateAccountWithSpaceTrimed(t *testing.T) {
+ m := mockAccountManager(t)
+ alias := " with space "
+ account, err := m.Manager.Create([]chainkd.XPub{testutil.TestXPub}, 1, alias, signers.BIP0044)
+
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if account.Alias != strings.TrimSpace(alias) {
+ t.Fatal("created account alias should be lowercase")
+ }
+
+ nilAccount, err := m.Manager.FindByAlias(alias)
+ if nilAccount != nil {
+ t.Fatal("expected nil")
+ }
+
+ target, err := m.Manager.FindByAlias(strings.ToLower(strings.TrimSpace(alias)))
+ if target == nil {
+ t.Fatal("expected Account, but got nil")
+ }
+}
+
+func TestCreateAccount(t *testing.T) {
+ m := mockAccountManager(t)
+ account, err := m.Manager.Create([]chainkd.XPub{testutil.TestXPub}, 1, "test-alias", signers.BIP0044)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ found, err := m.Manager.FindByID(account.ID)
+ if err != nil {
+ t.Errorf("unexpected error %v", err)
+ }
+
+ if !testutil.DeepEqual(account, found) {
+ t.Errorf("expected account %v to be recorded as %v", account, found)
+ }
+}
+
+func TestCreateAccountReusedAlias(t *testing.T) {
+ m := mockAccountManager(t)
+ m.createTestAccount(t, "test-alias", nil)
+
+ _, err := m.Manager.Create([]chainkd.XPub{testutil.TestXPub}, 1, "test-alias", signers.BIP0044)
+ if errors.Root(err) != acc.ErrDuplicateAlias {
+ t.Errorf("expected %s when reusing an alias, got %v", acc.ErrDuplicateAlias, err)
+ }
+}
+
+func TestUpdateAccountAlias(t *testing.T) {
+ oldAlias := "test-alias"
+ newAlias := "my-alias"
+
+ m := mockAccountManager(t)
+ account := m.createTestAccount(t, oldAlias, nil)
+ err := m.Manager.UpdateAccountAlias("testID", newAlias)
+ if err == nil {
+ t.Errorf("expected error when using an invalid account id")
+ }
+
+ err = m.Manager.UpdateAccountAlias(account.ID, oldAlias)
+ if errors.Root(err) != acc.ErrDuplicateAlias {
+ t.Errorf("expected %s when using a duplicate alias, got %v", acc.ErrDuplicateAlias, err)
+ }
+
+ err = m.Manager.UpdateAccountAlias(account.ID, newAlias)
+ if err != nil {
+ t.Errorf("expected account %v alias should be update", account)
+ }
+
+ updatedAccount, err := m.Manager.FindByID(account.ID)
+ if err != nil {
+ t.Errorf("unexpected error %v", err)
+ }
+
+ if updatedAccount.Alias != newAlias {
+ t.Errorf("alias:\ngot: %v\nwant: %v", updatedAccount.Alias, newAlias)
+ }
+
+ if _, err = m.Manager.FindByAlias(oldAlias); errors.Root(err) != acc.ErrFindAccount {
+ t.Errorf("expected %s when using a old alias, got %v", acc.ErrFindAccount, err)
+ }
+}
+
+func TestDeleteAccount(t *testing.T) {
+ m := mockAccountManager(t)
+
+ account1, err := m.Manager.Create([]chainkd.XPub{testutil.TestXPub}, 1, "test-alias1", signers.BIP0044)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ account2, err := m.Manager.Create([]chainkd.XPub{testutil.TestXPub}, 1, "test-alias2", signers.BIP0044)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ found, err := m.Manager.FindByID(account1.ID)
+ if err != nil {
+ t.Errorf("expected account %v should be deleted", found)
+ }
+
+ if err = m.Manager.DeleteAccount(account2.ID); err != nil {
+ t.Fatal(err)
+ }
+
+ found, err = m.Manager.FindByID(account2.ID)
+ if err != nil {
+ t.Errorf("expected account %v should be deleted", found)
+ }
+}
+
+func TestFindByID(t *testing.T) {
+ m := mockAccountManager(t)
+ account := m.createTestAccount(t, "", nil)
+
+ found, err := m.Manager.FindByID(account.ID)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if !testutil.DeepEqual(account, found) {
+ t.Errorf("expected found account to be %v, instead found %v", account, found)
+ }
+}
+
+func TestFindByAlias(t *testing.T) {
+ m := mockAccountManager(t)
+ account := m.createTestAccount(t, "some-alias", nil)
+
+ found, err := m.Manager.FindByAlias("some-alias")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if !testutil.DeepEqual(account, found) {
+ t.Errorf("expected found account to be %v, instead found %v", account, found)
+ }
+}
+
+type mockAccManager struct {
+ Manager *acc.Manager
+}
+
+func mockAccountManager(t *testing.T) *mockAccManager {
+ dirPath, err := ioutil.TempDir(".", "")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(dirPath)
+
+ testDB := dbm.NewDB("testdb", "memdb", dirPath)
+ dispatcher := event.NewDispatcher()
+ store := database.NewStore(testDB)
+ accountStore := database.NewAccountStore(testDB)
+ txPool := protocol.NewTxPool(store, dispatcher)
+ config.CommonConfig = config.DefaultConfig()
+ chain, err := protocol.NewChain(store, txPool, dispatcher)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ return &mockAccManager{acc.NewManager(accountStore, chain)}
+}
+
+func (m *mockAccManager) createTestAccount(t testing.TB, alias string, tags map[string]interface{}) *acc.Account {
+ account, err := m.Manager.Create([]chainkd.XPub{testutil.TestXPub}, 1, alias, signers.BIP0044)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ return account
+}