diff --git a/src/common/utils/__tests__/validations.test.ts b/src/common/utils/__tests__/validations.test.ts new file mode 100644 index 0000000000..e088fa0f37 --- /dev/null +++ b/src/common/utils/__tests__/validations.test.ts @@ -0,0 +1,57 @@ +import { Accounts } from "~/types"; +import { getUniqueAccountName } from "~/common/utils/validations"; + +function getMockAccounts(names: string[]): Accounts { + const accounts: Accounts = {}; + names.forEach((name: string, index: number) => { + accounts[(index + 1).toString()] = { + id: (index + 1).toString(), + connector: "lnd", + config: "", + name, + }; + }); + return accounts; +} + +describe("getUniqueAccountName", () => { + test("should return the same name if account account is not present yet", () => { + const name = "Lnd"; + const accounts: Accounts = {}; + const result = getUniqueAccountName(name, accounts); + + expect(result).toBe(name); + }); + + test("should append suffix '(1)' if account name already present", () => { + const name = "Lnd"; + const accounts: Accounts = getMockAccounts(["Lnd"]); + const result = getUniqueAccountName(name, accounts); + + expect(result).toBe("Lnd (1)"); + }); + + test("should append increased suffix '(2)' if account name already present", () => { + const name = "Lnd"; + const accounts: Accounts = getMockAccounts(["Lnd", "Lnd (1)"]); + const result = getUniqueAccountName(name, accounts); + + expect(result).toBe("Lnd (2)"); + }); + + test("should append increased suffix '(2)' if suffix (1) is already present", () => { + const name = "Lnd"; + const accounts: Accounts = getMockAccounts(["Lnd", "Lnd (1)"]); + const result = getUniqueAccountName(name, accounts); + + expect(result).toBe("Lnd (2)"); + }); + + test("should append increased suffix '(1)' if any suffix is present", () => { + const name = "Lnd"; + const accounts: Accounts = getMockAccounts(["Lnd", "Lnd (test)"]); + const result = getUniqueAccountName(name, accounts); + + expect(result).toBe("Lnd (1)"); + }); +}); diff --git a/src/common/utils/validations.ts b/src/common/utils/validations.ts index 8969d00d4b..1fe4db918a 100644 --- a/src/common/utils/validations.ts +++ b/src/common/utils/validations.ts @@ -1,3 +1,5 @@ +import { Account, Accounts } from "~/types"; + export const validate = (formData: Record) => { let password = ""; let passwordConfirmation = ""; @@ -14,3 +16,24 @@ export const validate = (formData: Record) => { passwordConfirmation, }; }; + +export function getUniqueAccountName(name: string, accounts: Accounts): string { + const accountNames = Object.values(accounts).map((el: Account) => el.name); + + let count = 1; + let uniqueName = name; + + while (accountNames.includes(uniqueName)) { + const match = uniqueName.match(/\((\d+)\)$/); + + if (match) { + const currentCount = parseInt(match[1]); + count = currentCount + 1; + uniqueName = uniqueName.replace(/\(\d+\)$/, `(${count})`); + } else { + uniqueName = `${name} (${count})`; + } + } + + return uniqueName; +} diff --git a/src/extension/background-script/actions/accounts/add.ts b/src/extension/background-script/actions/accounts/add.ts index 91f15c68d4..3276a78c7a 100644 --- a/src/extension/background-script/actions/accounts/add.ts +++ b/src/extension/background-script/actions/accounts/add.ts @@ -2,10 +2,12 @@ import { v4 as uuidv4 } from "uuid"; import { encryptData } from "~/common/lib/crypto"; import state from "~/extension/background-script/state"; import type { MessageAccountAdd } from "~/types"; +import { getUniqueAccountName } from "~/common/utils/validations"; const add = async (message: MessageAccountAdd) => { const newAccount = message.args; const accounts = state.getState().accounts; + const name = getUniqueAccountName(newAccount.name, accounts); const tmpAccounts = { ...accounts }; // TODO: add validations @@ -19,6 +21,7 @@ const add = async (message: MessageAccountAdd) => { tmpAccounts[accountId] = { ...newAccount, id: accountId, + name, }; state.setState({ accounts: tmpAccounts });