Skip to content

Commit

Permalink
Add state => query string function
Browse files Browse the repository at this point in the history
  • Loading branch information
amast09 committed Jul 24, 2021
1 parent dffbd78 commit 810e930
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 0 deletions.
75 changes: 75 additions & 0 deletions src/app-state-to-query-string.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import { appStateToQueryString } from "./app-state-to-query-string";
import { PayoffStrategy } from "./types/PayoffStrategy";

const loans = [
{
id: 0,
name: "foo",
balance: "7829",
interestRate: "3.2",
minimumPayment: "32",
},
{
id: 1,
name: "bar",
balance: "23390",
interestRate: "4.6",
minimumPayment: "392",
},
];

describe("appStateToQueryString", () => {
it("parses to an empty string when the monthly payment is an empty string", () => {
expect(
appStateToQueryString({
monthlyPayment: "",
loans,
payoffStrategy: PayoffStrategy.Avalanche,
})
).toEqual("");
});

it("parses to an empty string when the monthly payment is an empty string", () => {
expect(
appStateToQueryString({
monthlyPayment: "INVALID_NUMBER",
loans,
payoffStrategy: PayoffStrategy.Avalanche,
})
).toEqual("");
});

it("parses to an empty string when the loans are empty", () => {
expect(
appStateToQueryString({
monthlyPayment: "800",
loans: [],
payoffStrategy: PayoffStrategy.Avalanche,
})
).toEqual("");
});

it("parses to the correct query string when provided with a valid monthly payment and loans with an avalanche strategy", () => {
expect(
appStateToQueryString({
monthlyPayment: "600",
loans,
payoffStrategy: PayoffStrategy.Avalanche,
})
).toEqual(
"?monthlyPayment=600&payoffStrategy=Avalanche&name_0=foo&balance_0=7829&minimumPayment_0=32&interestRate_0=3.2&name_1=bar&balance_1=23390&minimumPayment_1=392&interestRate_1=4.6"
);
});

it("parses to the correct query string when provided with a valid monthly payment and loans with a snowball strategy", () => {
expect(
appStateToQueryString({
monthlyPayment: "600",
loans,
payoffStrategy: PayoffStrategy.Snowball,
})
).toEqual(
"?monthlyPayment=600&payoffStrategy=Snowball&name_0=foo&balance_0=7829&minimumPayment_0=32&interestRate_0=3.2&name_1=bar&balance_1=23390&minimumPayment_1=392&interestRate_1=4.6"
);
});
});
25 changes: 25 additions & 0 deletions src/app-state-to-query-string.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { FormLoan } from "./types/Loan";
import { stringIsNumber } from "./string-is-number";
import { PayoffStrategy } from "./types/PayoffStrategy";

interface AppStateToQueryParams {
readonly monthlyPayment: string;
readonly loans: FormLoan[];
readonly payoffStrategy: PayoffStrategy;
}

const loanToQueryParams = (loan: FormLoan): string =>
`&name_${loan.id}=${loan.name}&balance_${loan.id}=${loan.balance}&minimumPayment_${loan.id}=${loan.minimumPayment}&interestRate_${loan.id}=${loan.interestRate}`;

export const appStateToQueryString = (
params: AppStateToQueryParams
): string => {
const { monthlyPayment, loans, payoffStrategy } = params;
if (stringIsNumber(monthlyPayment) && loans.length > 0) {
return `?monthlyPayment=${monthlyPayment}&payoffStrategy=${payoffStrategy}${loans
.map(loanToQueryParams)
.join("")}`;
} else {
return "";
}
};

0 comments on commit 810e930

Please sign in to comment.