Midday / apps /engine /src /providers /teller /transform.test.ts
Jules
Final deployment with all fixes and verified content
c09f67c
import { expect, test } from "bun:test";
import {
transformAccount,
transformAccountBalance,
transformTransaction,
} from "./transform";
test("Transform pending transaction", () => {
expect(
transformTransaction({
accountType: "depository",
transaction: {
type: "check",
status: "pending",
running_balance: null,
links: {
self: "https://api.teller.io/accounts/acc_os41qe3a66ks2djhss000/transactions/txn_os41r5u90e29shubl2000",
account: "https://api.teller.io/accounts/acc_os41qe3a66ks2djhss000",
},
id: "txn_os41r5u90e29shubl2000",
details: {
processing_status: "complete",
counterparty: {
type: "organization",
name: "BANK OF MANY",
},
category: "general",
},
description: "Online Check Deposit",
date: "2024-03-05",
amount: "-83.62",
account_id: "acc_os41qe3a66ks2djhss000",
},
}),
).toMatchSnapshot();
});
test("Transform credit card purchase transaction", () => {
expect(
transformTransaction({
accountType: "credit",
transaction: {
type: "check",
status: "pending",
running_balance: null,
links: {
self: "https://api.teller.io/accounts/acc_os41qe3a66ks2djhss000/transactions/txn_os41r5u90e29shubl2000",
account: "https://api.teller.io/accounts/acc_os41qe3a66ks2djhss000",
},
id: "txn_os41r5u90e29shubl2000",
details: {
processing_status: "complete",
counterparty: {
type: "organization",
name: "BANK OF MANY",
},
category: "general",
},
description: "Technology",
date: "2024-03-05",
amount: "29",
account_id: "acc_os41qe3a66ks2djhss000",
},
}),
).toMatchSnapshot();
});
test("Transform credit card payment received - should be credit-card-payment not income", () => {
// When paying off a credit card, Teller reports negative amount (money coming IN to card)
// This should NOT be categorized as income - it's a credit card payment
expect(
transformTransaction({
accountType: "credit",
transaction: {
type: "payment",
status: "posted",
running_balance: "500.00",
links: {
self: "https://api.teller.io/accounts/acc_os41qe3a66ks2djhss000/transactions/txn_os41r5u90e29shubl3000",
account: "https://api.teller.io/accounts/acc_os41qe3a66ks2djhss000",
},
id: "txn_os41r5u90e29shubl3000",
details: {
processing_status: "complete",
counterparty: {
type: "organization",
name: "BANK PAYMENT",
},
category: "general",
},
description: "Payment Thank You",
date: "2024-03-05",
amount: "-200.00",
account_id: "acc_os41qe3a66ks2djhss000",
},
}),
).toMatchSnapshot();
});
test("Transform credit card refund - should have no category", () => {
// A refund on a credit card should not be auto-categorized
expect(
transformTransaction({
accountType: "credit",
transaction: {
type: "card_payment", // refunds often come through as card_payment type
status: "posted",
running_balance: "500.00",
links: {
self: "https://api.teller.io/accounts/acc_os41qe3a66ks2djhss000/transactions/txn_os41r5u90e29shubl4000",
account: "https://api.teller.io/accounts/acc_os41qe3a66ks2djhss000",
},
id: "txn_os41r5u90e29shubl4000",
details: {
processing_status: "complete",
counterparty: {
type: "organization",
name: "AMAZON REFUND",
},
category: "shopping",
},
description: "Amazon Refund",
date: "2024-03-05",
amount: "-50.00",
account_id: "acc_os41qe3a66ks2djhss000",
},
}),
).toMatchSnapshot();
});
test("Transform credit card cashback - should be income", () => {
// Cashback/rewards marked as income by Teller should stay as income
expect(
transformTransaction({
accountType: "credit",
transaction: {
type: "other",
status: "posted",
running_balance: "500.00",
links: {
self: "https://api.teller.io/accounts/acc_os41qe3a66ks2djhss000/transactions/txn_os41r5u90e29shubl5000",
account: "https://api.teller.io/accounts/acc_os41qe3a66ks2djhss000",
},
id: "txn_os41r5u90e29shubl5000",
details: {
processing_status: "complete",
counterparty: {
type: "organization",
name: "REWARDS",
},
category: "income",
},
description: "Cash Back Rewards",
date: "2024-03-05",
amount: "-25.00",
account_id: "acc_os41qe3a66ks2djhss000",
},
}),
).toMatchSnapshot();
});
test("Transform card payment transaction", () => {
expect(
transformTransaction({
accountType: "depository",
transaction: {
type: "card_payment",
status: "posted",
running_balance: "83431.46",
links: {
self: "https://api.teller.io/accounts/acc_os41qe3a66ks2djhss000/transactions/txn_os41r5u90e29shubl2005",
account: "https://api.teller.io/accounts/acc_os41qe3a66ks2djhss000",
},
id: "txn_os41r5u90e29shubl2005",
details: {
processing_status: "complete",
counterparty: {
type: "organization",
name: "NORDSTROM",
},
category: "shopping",
},
description: "Nordstrom",
date: "2024-03-01",
amount: "-68.90",
account_id: "acc_os41qe3a66ks2djhss000",
},
}),
).toMatchSnapshot();
});
test("Transform income transaction", () => {
expect(
transformTransaction({
accountType: "depository",
transaction: {
type: "card_payment",
status: "posted",
running_balance: "83296.40",
links: {
self: "https://api.teller.io/accounts/acc_os41qe3a66ks2djhss000/transactions/txn_os41r5u90e29shubl2002",
account: "https://api.teller.io/accounts/acc_os41qe3a66ks2djhss000",
},
id: "txn_os41r5u90e29shubl2002",
details: {
processing_status: "complete",
counterparty: {
type: "organization",
name: "EXXON MOBIL",
},
category: "fuel",
},
description: "Exxon Mobil",
date: "2024-03-03",
amount: "1000000",
account_id: "acc_os41qe3a66ks2djhss000",
},
}),
).toMatchSnapshot();
});
test("Transform type transfer", () => {
expect(
transformTransaction({
accountType: "depository",
transaction: {
type: "transfer",
status: "posted",
running_balance: "85897.25",
links: {
self: "https://api.teller.io/accounts/acc_os41qe3a66ks2djhss000/transactions/txn_os41r5ua0e29shubl2001",
account: "https://api.teller.io/accounts/acc_os41qe3a66ks2djhss000",
},
id: "txn_os41r5ua0e29shubl2001",
details: {
processing_status: "complete",
counterparty: {
type: "person",
name: "YOURSELF",
},
category: "general",
},
description: "Recurring Transfer to Savings",
date: "2024-01-27",
amount: "-37.99",
account_id: "acc_os41qe3a66ks2djhss000",
},
}),
).toMatchSnapshot();
});
test("Transform accounts", () => {
expect(
transformAccount({
type: "credit",
subtype: "credit_card",
status: "open",
name: "Platinum Card",
links: {
transactions:
"https://api.teller.io/accounts/acc_os557c2mge29shubl2000/transactions",
self: "https://api.teller.io/accounts/acc_os557c2mge29shubl2000",
balances:
"https://api.teller.io/accounts/acc_os557c2mge29shubl2000/balances",
},
last_four: "6587",
institution: {
name: "Mercury",
id: "mercury",
},
balance: {
currency: "USD",
amount: 2011100,
available_balance: null,
credit_limit: null,
},
id: "acc_os557c2mge29shubl2000",
enrollment_id: "enr_os557c8pck2deoskak000",
currency: "USD",
}),
).toMatchSnapshot();
});
test("Transform account balance - depository", () => {
expect(
transformAccountBalance({
balance: {
currency: "USD",
amount: 2011100,
},
accountType: "depository",
}),
).toMatchSnapshot();
});
test("Transform account balance - credit with positive (stays positive)", () => {
// Teller returns positive values for credit card debt
expect(
transformAccountBalance({
balance: {
currency: "USD",
amount: 150000,
},
accountType: "credit",
}),
).toEqual({
currency: "USD",
amount: 150000,
available_balance: null,
credit_limit: null,
});
});
test("Transform account balance - credit with negative (normalized to positive)", () => {
// Safety: if Teller ever returns negative credit balance, normalize it
expect(
transformAccountBalance({
balance: {
currency: "USD",
amount: -150000,
},
accountType: "credit",
}),
).toEqual({
currency: "USD",
amount: 150000,
available_balance: null,
credit_limit: null,
});
});