Skip to content

Commit

Permalink
refactor!: make stake pool metrics an optional property to handle act…
Browse files Browse the repository at this point in the history
…ivating pools
  • Loading branch information
iccicci authored and rhyslbw committed Jun 2, 2023
1 parent 8afbffd commit d33bd07
Show file tree
Hide file tree
Showing 7 changed files with 34 additions and 30 deletions.
Expand Up @@ -57,6 +57,8 @@ export const refreshPoolMetrics = async (options: RefreshPoolMetricsOptions) =>

const { metrics } = pageResults[0];

if (!metrics) return logger.warn(`No metrics found for stake pool ${id}`);

await savePoolMetrics({ ...options, metrics });
} catch (error) {
logger.error(`Error while refreshing metrics for stake pool ${id}`, error);
Expand Down
Expand Up @@ -1273,19 +1273,19 @@ describe('StakePoolHttpService', () => {
it('desc order', async () => {
const response = await provider.queryStakePools(setSortCondition({ pagination }, 'desc', 'apy'));
expect(response.pageResults.length).toBeGreaterThan(0);
expect(response.pageResults[0].metrics.apy).toBeDefined();
expect(response.pageResults[0].metrics?.apy).toBeDefined();
});
it('asc order', async () => {
const response = await provider.queryStakePools(setSortCondition({ pagination }, 'asc', 'apy'));
expect(response.pageResults.length).toBeGreaterThan(0);
expect(response.pageResults[0].metrics.apy).toBeDefined();
expect(response.pageResults[0].metrics?.apy).toBeDefined();
});
it('with applied filters', async () => {
const response = await provider.queryStakePools(
setSortCondition(setFilterCondition(filterArgs, 'or'), 'asc', 'apy')
);
expect(response.pageResults.length).toBeGreaterThan(0);
expect(response.pageResults[0].metrics.apy).toBeDefined();
expect(response.pageResults[0].metrics?.apy).toBeDefined();
});
it('with applied pagination', async () => {
const firstPageOptions = setSortCondition(setPagination({ pagination }, 0, 3), 'desc', 'apy');
Expand Down Expand Up @@ -1334,7 +1334,9 @@ describe('StakePoolHttpService', () => {
it('apyEpochsBackLimit is correctly honored', async () => {
const limitThreeResponse = await provider.queryStakePools({ apyEpochsBackLimit: 3, pagination });
const limitFiveResponse = await provider.queryStakePools({ apyEpochsBackLimit: 5, pagination });
expect(limitThreeResponse.pageResults[0].metrics.apy).not.toBe(limitFiveResponse.pageResults[0].metrics.apy);
expect(limitThreeResponse.pageResults[0].metrics?.apy).not.toBe(
limitFiveResponse.pageResults[0].metrics?.apy
);
});
});

Expand Down Expand Up @@ -1394,25 +1396,25 @@ describe('StakePoolHttpService', () => {
describe('/search', () => {
it('response excludes stake pool APY metric', async () => {
const response = await provider.queryStakePools({ pagination: { limit: 1, startAt: 0 } });
expect(response.pageResults[0].metrics.apy).toBeUndefined();
expect(response.pageResults[0].metrics?.apy).toBeUndefined();
});
describe('sort by APY', () => {
it('desc order', async () => {
const response = await provider.queryStakePools(setSortCondition({ pagination }, 'desc', 'apy'));
expect(response.pageResults.length).toBeGreaterThan(0);
expect(response.pageResults[0].metrics.apy).toBeUndefined();
expect(response.pageResults[0].metrics?.apy).toBeUndefined();
});
it('asc order', async () => {
const response = await provider.queryStakePools(setSortCondition({ pagination }, 'asc', 'apy'));
expect(response.pageResults.length).toBeGreaterThan(0);
expect(response.pageResults[0].metrics.apy).toBeUndefined();
expect(response.pageResults[0].metrics?.apy).toBeUndefined();
});
it('with applied filters', async () => {
const response = await provider.queryStakePools(
setSortCondition(setFilterCondition(filterArgs, 'or'), 'asc', 'apy')
);
expect(response.pageResults.length).toBeGreaterThan(0);
expect(response.pageResults[0].metrics.apy).toBeUndefined();
expect(response.pageResults[0].metrics?.apy).toBeUndefined();
});
});
});
Expand Down
Expand Up @@ -666,16 +666,16 @@ describe('TypeormStakePoolProvider', () => {
describe('sort by saturation', () => {
it('desc order', async () => {
const response = await provider.queryStakePools(setSortCondition({ pagination }, 'desc', 'saturation'));
expect(response.pageResults[0].metrics.saturation).toEqual(poolsInfoWithMetrics[8].saturation);
expect(response.pageResults[response.pageResults.length - 1].metrics.saturation).toEqual(
expect(response.pageResults[0].metrics?.saturation).toEqual(poolsInfoWithMetrics[8].saturation);
expect(response.pageResults[response.pageResults.length - 1].metrics?.saturation).toEqual(
poolsInfoWithMetrics[9].saturation
);
});

it('asc order', async () => {
const response = await provider.queryStakePools(setSortCondition({ pagination }, 'asc', 'saturation'));
expect(response.pageResults[0].metrics.saturation).toEqual(poolsInfoWithMetrics[4].saturation);
expect(response.pageResults[response.pageResults.length - 1].metrics.saturation).toEqual(
expect(response.pageResults[0].metrics?.saturation).toEqual(poolsInfoWithMetrics[4].saturation);
expect(response.pageResults[response.pageResults.length - 1].metrics?.saturation).toEqual(
poolsInfoWithMetrics[1].saturation
);
});
Expand All @@ -684,8 +684,8 @@ describe('TypeormStakePoolProvider', () => {
const response = await provider.queryStakePools(
setSortCondition(setFilterCondition(filterArgs, 'or'), 'asc', 'saturation')
);
expect(response.pageResults[0].metrics.saturation).toEqual(poolsInfoWithMetrics[4].saturation);
expect(response.pageResults[response.totalResultCount - 1].metrics.saturation).toEqual(
expect(response.pageResults[0].metrics?.saturation).toEqual(poolsInfoWithMetrics[4].saturation);
expect(response.pageResults[response.totalResultCount - 1].metrics?.saturation).toEqual(
poolsInfoWithMetrics[1].saturation
);
});
Expand All @@ -694,16 +694,16 @@ describe('TypeormStakePoolProvider', () => {
describe('sort by apy', () => {
it('desc order', async () => {
const response = await provider.queryStakePools(setSortCondition({ pagination }, 'desc', 'apy'));
expect(response.pageResults[0].metrics.apy).toEqual(poolsInfoWithMetrics[6].apy);
expect(response.pageResults[response.pageResults.length - 1].metrics.apy).toEqual(
expect(response.pageResults[0].metrics?.apy).toEqual(poolsInfoWithMetrics[6].apy);
expect(response.pageResults[response.pageResults.length - 1].metrics?.apy).toEqual(
poolsInfoWithMetrics[1].apy
);
});

it('asc order', async () => {
const response = await provider.queryStakePools(setSortCondition({ pagination }, 'asc', 'apy'));
expect(response.pageResults[0].metrics.apy).toEqual(poolsInfoWithMetrics[2].apy);
expect(response.pageResults[response.pageResults.length - 1].metrics.apy).toEqual(
expect(response.pageResults[0].metrics?.apy).toEqual(poolsInfoWithMetrics[2].apy);
expect(response.pageResults[response.pageResults.length - 1].metrics?.apy).toEqual(
poolsInfoWithMetrics[0].apy
);
});
Expand All @@ -712,8 +712,8 @@ describe('TypeormStakePoolProvider', () => {
const response = await provider.queryStakePools(
setSortCondition(setFilterCondition(filterArgs, 'or'), 'asc', 'apy')
);
expect(response.pageResults[0].metrics.apy).toEqual(poolsInfoWithMetrics[2].apy);
expect(response.pageResults[response.totalResultCount - 1].metrics.apy).toEqual(
expect(response.pageResults[0].metrics?.apy).toEqual(poolsInfoWithMetrics[2].apy);
expect(response.pageResults[response.totalResultCount - 1].metrics?.apy).toEqual(
poolsInfoWithMetrics[0].apy
);
});
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/Cardano/types/StakePool/StakePool.ts
Expand Up @@ -162,7 +162,7 @@ export interface StakePool extends PoolParameters {
/**
* Stake pool metrics
*/
metrics: StakePoolMetrics;
metrics?: StakePoolMetrics;

/**
* Stake pool status
Expand Down
10 changes: 5 additions & 5 deletions packages/e2e/test/blockfrost/StakePoolCompare.test.ts
Expand Up @@ -170,8 +170,8 @@ describe('StakePoolCompare', () => {
let metricTwo: Cardano.StakePoolMetrics;

beforeAll(() => {
metricOne = poolOne.metrics;
metricTwo = poolTwo.metrics;
metricOne = poolOne.metrics!;
metricTwo = poolTwo.metrics!;
});

// check apy
Expand Down Expand Up @@ -224,14 +224,14 @@ describe('StakePoolCompare', () => {
const result = await fetchAllPools(providerOne, { sort: { field: 'saturation', order: 'asc' } });

for (let i = 1; i < result.length; ++i)
expect(result[i - 1].metrics.saturation).toBeLessThanOrEqual(result[i].metrics.saturation);
expect(result[i - 1].metrics?.saturation).toBeLessThanOrEqual(result[i].metrics!.saturation);
});

it('by saturation desc', async () => {
const result = await fetchAllPools(providerOne, { sort: { field: 'saturation', order: 'desc' } });

for (let i = 1; i < result.length; ++i)
expect(result[i - 1].metrics.saturation).toBeGreaterThanOrEqual(result[i].metrics.saturation);
expect(result[i - 1].metrics?.saturation).toBeGreaterThanOrEqual(result[i].metrics!.saturation);
});
});

Expand All @@ -255,7 +255,7 @@ describe('StakePoolCompare', () => {

statusCount[pool.status]++;

if (pool.metrics.livePledge >= pool.pledge) poolsMeetingPledge++;
if (pool.metrics!.livePledge >= pool.pledge) poolsMeetingPledge++;
else {
poolsNotMeetingPledge++;

Expand Down
4 changes: 2 additions & 2 deletions packages/e2e/test/local-network/register-pool.test.ts
Expand Up @@ -144,7 +144,7 @@ describe('local-network/register-pool', () => {
expect(result.pageResults[0].hexId).toBe(Cardano.PoolIdHex(poolKeyHash));
expect(result.pageResults[0].id).toBe(poolId);
expect(result.pageResults[0].status).toBe(Cardano.StakePoolStatus.Activating);
expect(result.pageResults[0].metrics.livePledge).toBeLessThan(result.pageResults[0].pledge);
expect(result.pageResults[0].metrics?.livePledge).toBeLessThan(result.pageResults[0].pledge);
});

test('meets pledge', async () => {
Expand Down Expand Up @@ -229,6 +229,6 @@ describe('local-network/register-pool', () => {
expect(result.pageResults[0].hexId).toBe(Cardano.PoolIdHex(poolKeyHash));
expect(result.pageResults[0].id).toBe(poolId);
expect(result.pageResults[0].status).toBe(Cardano.StakePoolStatus.Activating);
expect(result.pageResults[0].metrics.livePledge).toBeGreaterThan(result.pageResults[0].pledge);
expect(result.pageResults[0].metrics?.livePledge).toBeGreaterThan(result.pageResults[0].pledge);
});
});
4 changes: 2 additions & 2 deletions packages/e2e/test/providers/StakePoolProvider.test.ts
Expand Up @@ -260,13 +260,13 @@ describe('StakePoolProvider', () => {
it('with pledgeMet false', async () => {
const { pageResults } = await query({ pledgeMet: false });

for (const pool of pageResults) expect(pool.pledge > pool.metrics.livePledge).toBeTruthy();
for (const pool of pageResults) expect(pool.pledge > pool.metrics!.livePledge).toBeTruthy();
});

it('with pledgeMet true', async () => {
const { pageResults } = await query({ pledgeMet: true });

for (const pool of pageResults) expect(pool.pledge <= pool.metrics.livePledge).toBeTruthy();
for (const pool of pageResults) expect(pool.pledge <= pool.metrics!.livePledge).toBeTruthy();
});

it('pools number = meeting pools number + not meeting pools number', async () => {
Expand Down

0 comments on commit d33bd07

Please sign in to comment.