Last active
March 24, 2021 21:42
-
-
Save gcangussu/ceab7139f56934936b903e04eab71f6d to your computer and use it in GitHub Desktop.
Mock /loan/rfqs/ endpoint on frontend. You need to change two files.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// packages/utils/tests/factories.ts | |
// import { createHash } from 'crypto'; | |
import faker from 'faker'; | |
/** | |
* Seed the random sequence that generates the random values. | |
* @param sentence Any string to use as seed | |
*/ | |
export function seed(sentence: string) { | |
// const num = createHash('MD4').update(sentence).digest().readDoubleBE(0); | |
let num = 0; | |
for (const c of sentence) { | |
num += c.charCodeAt(0) * num ** 2; | |
} | |
faker.seed(num); | |
} | |
/** | |
* Make multiple instances of a factory. | |
* | |
* @example | |
* // returns [A0, A1, ..., A4] | |
* makeList(makeA, 5); | |
* | |
* @example | |
* // Provide custom data for instantiation | |
* makeList(makeA, 5, (i) => { | |
* if (i === 2) return { param1: 'value' }; | |
* return {}; | |
* }) | |
*/ | |
export function makeList<T>( | |
maker: (data?: Partial<T>) => T, | |
count: number, | |
getData?: (i: number) => Partial<T>, | |
): T[] { | |
const mapper = | |
getData != null | |
? (_: unknown, i: number) => maker(getData(i)) | |
: () => maker(); | |
return new Array(count).fill(null).map(mapper); | |
} | |
/** | |
* Make multiple instances of a factory. Like `makeList`, but returns | |
* an object mapping `id`s to the instances created. | |
*/ | |
export function makeMapObject< | |
T extends { readonly id: K }, | |
K extends string | number | |
>( | |
maker: (data?: Partial<T>) => T, | |
count: number, | |
getData?: (i: number) => Partial<T>, | |
): Record<K, T> { | |
const list = makeList(maker, count, getData); | |
const map: Record<string | number, T> = {}; | |
for (const item of list) { | |
map[item.id] = item; | |
} | |
return map; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// packages/api/src/loans.ts | |
import { AsyncResp, BaseReq, request } from './fetch-api'; | |
import { normalizeLoanRfqs } from './normalize/loans'; | |
import { LoanRfq, LoanQuote, RawLoanRfq } from './types/loans'; | |
import { keyBy } from 'lodash'; | |
import { makeQuote, makeRfq, makeTerm } from '../tests/factories/loans'; | |
import { seed, makeMapObject } from '@paradigm/utils/tests/factories'; | |
seed('yolo'); | |
const start = Date.now() - 2 * 60 * 60 * 1000; | |
const quote1 = makeQuote({ is_filled: true }); | |
const rfq1 = makeRfq({ | |
created_at: new Date(start + 1000), | |
is_maker: true, | |
type: 'LD', | |
term: makeTerm({ quotes: [quote1.id] }), | |
}); | |
const quote2 = makeQuote({ is_filled: true }); | |
const rfq2 = makeRfq({ | |
created_at: new Date(start + 2000), | |
is_maker: true, | |
type: 'BW', | |
term: makeTerm({ quotes: [quote2.id] }), | |
}); | |
const quote3 = makeQuote({ is_filled: false }); | |
const rfq3 = makeRfq({ | |
created_at: new Date(start + 3000), | |
is_canceled: true, | |
is_filled: false, | |
expires_at: new Date(Date.now() + 99999999), | |
is_maker: true, | |
term: makeTerm({ quotes: [quote3.id] }), | |
}); | |
const quote4 = makeQuote({ is_filled: false }); | |
const rfq4 = makeRfq({ | |
created_at: new Date(start + 4000), | |
is_canceled: false, | |
is_filled: true, | |
expires_at: new Date(Date.now() + 99999999), | |
is_maker: true, | |
term: makeTerm({ quotes: [quote4.id] }), | |
}); | |
const quote5 = makeQuote({ is_filled: false }); | |
const rfq5 = makeRfq({ | |
created_at: new Date(start + 5000), | |
is_canceled: false, | |
is_filled: false, | |
expires_at: new Date(Date.now() - 1000), | |
is_maker: true, | |
term: makeTerm({ quotes: [quote5.id] }), | |
}); | |
const quote6 = makeQuote({ is_filled: false }); | |
const rfq6 = makeRfq({ | |
created_at: new Date(start + 6000), | |
is_canceled: false, | |
is_filled: false, | |
expires_at: new Date(Date.now() + 99999999), | |
is_maker: true, | |
type: 'BW', | |
term: makeTerm({ quotes: [quote6.id] }), | |
}); | |
const quote7 = makeQuote({ is_filled: false }); | |
const rfq7 = makeRfq({ | |
created_at: new Date(start + 7000), | |
is_canceled: false, | |
is_filled: false, | |
expires_at: new Date(Date.now() + 99999999), | |
is_maker: true, | |
type: 'LD', | |
term: makeTerm({ quotes: [quote6.id] }), | |
}); | |
const rfq11 = makeRfq({ | |
created_at: new Date(start + 11000), | |
is_maker: true, | |
type: 'LD', | |
}); | |
const rfq12 = makeRfq({ | |
created_at: new Date(start + 12000), | |
is_maker: true, | |
type: 'BW', | |
}); | |
const rfq13 = makeRfq({ | |
created_at: new Date(start + 13000), | |
is_canceled: true, | |
is_filled: false, | |
expires_at: new Date(Date.now() + 99999999), | |
is_maker: true, | |
}); | |
const rfq14 = makeRfq({ | |
created_at: new Date(start + 14000), | |
is_canceled: false, | |
is_filled: true, | |
expires_at: new Date(Date.now() + 99999999), | |
is_maker: true, | |
}); | |
const rfq15 = makeRfq({ | |
created_at: new Date(start + 15000), | |
is_canceled: false, | |
is_filled: false, | |
expires_at: new Date(Date.now() - 1000), | |
is_maker: true, | |
}); | |
const rfq16 = makeRfq({ | |
created_at: new Date(start + 16000), | |
is_canceled: false, | |
is_filled: false, | |
expires_at: new Date(Date.now() + 99999999), | |
is_maker: true, | |
type: 'BW', | |
}); | |
const rfq17 = makeRfq({ | |
created_at: new Date(start + 17000), | |
is_canceled: false, | |
is_filled: false, | |
expires_at: new Date(Date.now() + 99999999), | |
is_maker: true, | |
type: 'LD', | |
}); | |
const quote101 = makeQuote({ is_filled: true }); | |
const rfq101 = makeRfq({ | |
created_at: new Date(start + 101000), | |
is_maker: false, | |
type: 'LD', | |
term: makeTerm({ quotes: [quote101.id] }), | |
}); | |
const quote102 = makeQuote({ is_filled: true }); | |
const rfq102 = makeRfq({ | |
created_at: new Date(start + 102000), | |
is_maker: false, | |
type: 'BW', | |
term: makeTerm({ quotes: [quote102.id] }), | |
}); | |
const quote103 = makeQuote({ is_filled: false }); | |
const rfq103 = makeRfq({ | |
created_at: new Date(start + 103000), | |
is_canceled: true, | |
is_filled: false, | |
expires_at: new Date(Date.now() + 99999999), | |
is_maker: false, | |
term: makeTerm({ quotes: [quote103.id] }), | |
}); | |
// const quote104 = makeQuote({ is_filled: false }); | |
// const rfq104 = makeRfq({ | |
// created_at: new Date(start + 104000), | |
// is_canceled: false, | |
// is_filled: true, | |
// expires_at: new Date(Date.now() + 99999999), | |
// is_maker: false, | |
// term: makeTerm({ quotes: [quote104.id] }), | |
// }); | |
const quote105 = makeQuote({ is_filled: false }); | |
const rfq105 = makeRfq({ | |
created_at: new Date(start + 105000), | |
is_canceled: false, | |
is_filled: false, | |
expires_at: new Date(Date.now() - 1000), | |
is_maker: false, | |
term: makeTerm({ quotes: [quote105.id] }), | |
}); | |
const quote106 = makeQuote({ is_filled: false }); | |
const rfq106 = makeRfq({ | |
created_at: new Date(start + 106000), | |
is_canceled: false, | |
is_filled: false, | |
expires_at: new Date(Date.now() + 99999999), | |
is_maker: false, | |
type: 'BW', | |
term: makeTerm({ quotes: [quote106.id] }), | |
}); | |
const quote107 = makeQuote({ is_filled: false }); | |
const rfq107 = makeRfq({ | |
created_at: new Date(start + 107000), | |
is_canceled: false, | |
is_filled: false, | |
expires_at: new Date(Date.now() + 99999999), | |
is_maker: false, | |
type: 'LD', | |
term: makeTerm({ quotes: [quote6.id] }), | |
}); | |
const rfq111 = makeRfq({ | |
created_at: new Date(start + 1011000), | |
is_maker: false, | |
type: 'LD', | |
}); | |
const rfq112 = makeRfq({ | |
created_at: new Date(start + 1012000), | |
is_maker: false, | |
type: 'BW', | |
}); | |
const rfq113 = makeRfq({ | |
created_at: new Date(start + 1013000), | |
is_canceled: true, | |
is_filled: false, | |
expires_at: new Date(Date.now() + 99999999), | |
is_maker: false, | |
}); | |
// const rfq114 = makeRfq({ | |
// created_at: new Date(start + 1014000), | |
// is_canceled: false, | |
// is_filled: true, | |
// expires_at: new Date(Date.now() + 99999999), | |
// is_maker: false, | |
// }); | |
const rfq115 = makeRfq({ | |
created_at: new Date(start + 1015000), | |
is_canceled: false, | |
is_filled: false, | |
expires_at: new Date(Date.now() - 1000), | |
is_maker: false, | |
}); | |
const rfq116 = makeRfq({ | |
created_at: new Date(start + 1016000), | |
is_canceled: false, | |
is_filled: false, | |
expires_at: new Date(Date.now() + 99999999), | |
is_maker: false, | |
type: 'BW', | |
}); | |
const rfq117 = makeRfq({ | |
created_at: new Date(start + 1017000), | |
is_canceled: false, | |
is_filled: false, | |
expires_at: new Date(Date.now() + 99999999), | |
is_maker: false, | |
type: 'LD', | |
}); | |
const quotes = keyBy( | |
[ | |
quote1, | |
quote2, | |
quote3, | |
quote4, | |
quote5, | |
quote6, | |
quote7, | |
quote101, | |
quote102, | |
quote103, | |
// quote104, | |
quote105, | |
quote106, | |
quote107, | |
], | |
'id', | |
); | |
const rfqs = keyBy( | |
[ | |
rfq1, | |
rfq2, | |
rfq3, | |
rfq4, | |
rfq5, | |
rfq6, | |
rfq7, | |
rfq11, | |
rfq12, | |
rfq13, | |
rfq14, | |
rfq15, | |
rfq16, | |
rfq17, | |
rfq101, | |
rfq102, | |
rfq103, | |
// rfq104, | |
rfq105, | |
rfq106, | |
rfq107, | |
rfq111, | |
rfq112, | |
rfq113, | |
// rfq114, | |
rfq115, | |
rfq116, | |
rfq117, | |
], | |
'id', | |
); | |
export interface GetLoansRfqsReq extends BaseReq { | |
readonly page: number; | |
} | |
interface RawGetLoansRfqsResp { | |
readonly count: number; | |
readonly next: number | null; | |
readonly previous: number | null; | |
readonly results: RawLoanRfq[]; | |
} | |
export interface GetLoansRfqsResp { | |
readonly count: number; | |
readonly next: number | null; | |
readonly previous: number | null; | |
/** Loan rfq ids */ | |
readonly results: readonly number[]; | |
readonly rfqs: { readonly [id: number]: LoanRfq }; | |
readonly quotes: { readonly [id: number]: LoanQuote }; | |
} | |
export async function getLoansRfqs( | |
req: GetLoansRfqsReq, | |
): AsyncResp<GetLoansRfqsResp> { | |
await new Promise((resolve) => setTimeout(resolve, 2500)); | |
return { | |
ok: true, | |
error: '', | |
message: '', | |
status: 200, | |
data: { | |
count: 1, | |
next: null, | |
previous: null, | |
quotes, | |
rfqs, | |
results: Object.values(rfqs).map((rfq) => rfq.id), | |
}, | |
}; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment