Skip to content

Commit

Permalink
Merge balance entities and schemas (#1476)
Browse files Browse the repository at this point in the history
Merges all balance-related entities with their schemas:

- Combines and `balance.schema.ts` and `balance.entity.ts`
- Moves `BalanceTokenSchema` to `balance.token.entity`
- Updates associated imports, builders and tests
  • Loading branch information
iamacook authored Apr 29, 2024
1 parent 81f3568 commit fdd3fc0
Show file tree
Hide file tree
Showing 7 changed files with 88 additions and 93 deletions.
2 changes: 1 addition & 1 deletion src/domain/balances/balances.repository.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Inject, Injectable } from '@nestjs/common';
import { IBalancesRepository } from '@/domain/balances/balances.repository.interface';
import { Balance } from '@/domain/balances/entities/balance.entity';
import { BalanceSchema } from '@/domain/balances/entities/schemas/balance.schema';
import { BalanceSchema } from '@/domain/balances/entities/balance.entity';
import { IBalancesApiManager } from '@/domain/interfaces/balances-api.manager.interface';

@Injectable()
Expand Down
2 changes: 1 addition & 1 deletion src/domain/balances/entities/__tests__/balance.builder.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Builder, IBuilder } from '@/__tests__/builder';
import { faker } from '@faker-js/faker';
import { balanceTokenBuilder } from './balance.token.builder';
import { balanceTokenBuilder } from '@/domain/balances/entities/__tests__/balance.token.builder';
import { Balance } from '@/domain/balances/entities/balance.entity';
import { getAddress } from 'viem';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
import { balanceBuilder } from '@/domain/balances/entities/__tests__/balance.builder';
import { balanceTokenBuilder } from '@/domain/balances/entities/__tests__/balance.token.builder';
import {
BalanceSchema,
BalanceTokenSchema,
Erc20BalanceSchema,
NativeBalanceSchema,
} from '@/domain/balances/entities/schemas/balance.schema';
} from '@/domain/balances/entities/balance.entity';
import { faker } from '@faker-js/faker';
import { getAddress } from 'viem';
import { ZodError } from 'zod';

describe('Balances schema', () => {
describe('Balance entity schemas', () => {
describe('NativeBalanceSchema', () => {
it('should validate a valid native balance', () => {
const nativeBalance = balanceBuilder()
Expand Down Expand Up @@ -55,55 +53,6 @@ describe('Balances schema', () => {
});
});

describe('BalanceTokenSchema', () => {
it('should validate a valid balance token', () => {
const balanceToken = balanceTokenBuilder().build();

const result = BalanceTokenSchema.safeParse(balanceToken);

expect(result.success).toBe(true);
});

it('should not allow an invalid balance token', () => {
const balanceToken = { invalid: 'balanceToken' };

const result = BalanceTokenSchema.safeParse(balanceToken);

expect(!result.success && result.error).toStrictEqual(
new ZodError([
{
code: 'invalid_type',
expected: 'string',
received: 'undefined',
path: ['name'],
message: 'Required',
},
{
code: 'invalid_type',
expected: 'string',
received: 'undefined',
path: ['symbol'],
message: 'Required',
},
{
code: 'invalid_type',
expected: 'number',
received: 'undefined',
path: ['decimals'],
message: 'Required',
},
{
code: 'invalid_type',
expected: 'string',
received: 'undefined',
path: ['logoUri'],
message: 'Required',
},
]),
);
});
});

describe('Erc20BalanceSchema', () => {
it('should validate a valid ERC-20 balance', () => {
const erc20Balance = balanceBuilder().build();
Expand Down
30 changes: 25 additions & 5 deletions src/domain/balances/entities/balance.entity.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,32 @@
import {
BalanceSchema,
Erc20BalanceSchema,
NativeBalanceSchema,
} from '@/domain/balances/entities/schemas/balance.schema';
import { BalanceTokenSchema } from '@/domain/balances/entities/balance.token.entity';
import { AddressSchema } from '@/validation/entities/schemas/address.schema';
import { z } from 'zod';

export type NativeBalance = z.infer<typeof NativeBalanceSchema>;

export type Erc20Balance = z.infer<typeof Erc20BalanceSchema>;

export type Balance = z.infer<typeof BalanceSchema>;

export const NativeBalanceSchema = z.object({
// Likely `null` but for safety we allow optional defaulting
tokenAddress: z.null().optional().default(null),
token: z.null().optional().default(null),
balance: z.string(),
});

export const Erc20BalanceSchema = z.object({
tokenAddress: AddressSchema,
token: BalanceTokenSchema,
balance: z.string(),
});

const FiatSchema = z.object({
fiatBalance: z.string().nullish().default(null),
fiatConversion: z.string().nullish().default(null),
});

export const BalanceSchema = z.union([
NativeBalanceSchema.merge(FiatSchema),
Erc20BalanceSchema.merge(FiatSchema),
]);
52 changes: 52 additions & 0 deletions src/domain/balances/entities/balance.token.entity.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { balanceTokenBuilder } from '@/domain/balances/entities/__tests__/balance.token.builder';
import { BalanceTokenSchema } from '@/domain/balances/entities/balance.token.entity';
import { ZodError } from 'zod';

describe('BalanceTokenSchema', () => {
it('should validate a valid balance token', () => {
const balanceToken = balanceTokenBuilder().build();

const result = BalanceTokenSchema.safeParse(balanceToken);

expect(result.success).toBe(true);
});

it('should not allow an invalid balance token', () => {
const balanceToken = { invalid: 'balanceToken' };

const result = BalanceTokenSchema.safeParse(balanceToken);

expect(!result.success && result.error).toStrictEqual(
new ZodError([
{
code: 'invalid_type',
expected: 'string',
received: 'undefined',
path: ['name'],
message: 'Required',
},
{
code: 'invalid_type',
expected: 'string',
received: 'undefined',
path: ['symbol'],
message: 'Required',
},
{
code: 'invalid_type',
expected: 'number',
received: 'undefined',
path: ['decimals'],
message: 'Required',
},
{
code: 'invalid_type',
expected: 'string',
received: 'undefined',
path: ['logoUri'],
message: 'Required',
},
]),
);
});
});
8 changes: 7 additions & 1 deletion src/domain/balances/entities/balance.token.entity.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
import { BalanceTokenSchema } from '@/domain/balances/entities/schemas/balance.schema';
import { z } from 'zod';

export type BalanceToken = z.infer<typeof BalanceTokenSchema>;

export const BalanceTokenSchema = z.object({
name: z.string(),
symbol: z.string(),
decimals: z.number(),
logoUri: z.string(),
});
32 changes: 0 additions & 32 deletions src/domain/balances/entities/schemas/balance.schema.ts

This file was deleted.

0 comments on commit fdd3fc0

Please sign in to comment.