-
import { Cardano } from '@cardano-sdk/core';
+
import * as handler from '../../src/PgBoss';
+
import { Cardano, NotImplementedError, ProviderError, ProviderFailure } from '@cardano-sdk/core';
+
import { DataMocks } from '../data-mocks';
import { DataSource } from 'typeorm';
import { Hash32ByteBase16 } from '@cardano-sdk/crypto';
import { PoolMetadataEntity, PoolRegistrationEntity } from '@cardano-sdk/projection-typeorm';
+
import { StakePoolMetadataFetchMode } from '../../src/Program/options';
import { initHandlerTest, poolId } from './util';
-
import { isUpdateOutdated, savePoolMetadata } from '../../src/PgBoss';
describe('stakePoolMetadataHandler', () => {
const rewardAccount = 'test_addr';
describe('isUpdateOutdated', () => {
it('returns true if there is a newer pool update', async () => {
-
expect(await isUpdateOutdated(dataSource, poolId, '23')).toBe(true);
+
expect(await handler.isUpdateOutdated(dataSource, poolId, '23')).toBe(true);
it('returns false if there are no newer pool updates', async () => {
-
expect(await isUpdateOutdated(dataSource, poolId, '42')).toBe(false);
+
expect(await handler.isUpdateOutdated(dataSource, poolId, '42')).toBe(false);
expect(await metadataRepos.find({ where: { poolUpdate } })).toEqual([]);
-
await savePoolMetadata({ dataSource, hash, metadata, poolId, poolRegistrationId });
+
await handler.savePoolMetadata({ dataSource, hash, metadata, poolId, poolRegistrationId });
// One record was inserted
const insertResult = await metadataRepos.find({ where: { poolUpdate } });
expect(insertResult).toEqual([{ description, ext, hash, homepage, id: insertResult[0].id, name, ticker }]);
metadata.name = 'updated';
-
await savePoolMetadata({ dataSource, hash, metadata, poolId, poolRegistrationId });
+
await handler.savePoolMetadata({ dataSource, hash, metadata, poolId, poolRegistrationId });
// One record updated and no records inserted
const updateResult = await metadataRepos.find({ where: { poolUpdate } });
expect(await metadataRepos.find({ where: { poolUpdate } })).toEqual([]);
// Failing insert attempt
-
await savePoolMetadata({ dataSource, hash, metadata, poolId, poolRegistrationId });
+
await handler.savePoolMetadata({ dataSource, hash, metadata, poolId, poolRegistrationId });
-
// No records was inserted
+
// No records were inserted
expect(await metadataRepos.find({ where: { poolUpdate } })).toEqual([]);
+
describe('attachExtendedMetadata', () => {
+
description: 'description',
+
} as Cardano.StakePoolMetadata;
+
it('attaches full extended metadata', async () => {
+
const expectedExtendedMetadata = DataMocks.Pool.adaPoolExtendedMetadata;
+
const attachedMetadata = handler.attachExtendedMetadata(metadata, expectedExtendedMetadata);
+
expect(attachedMetadata).not.toBeNull();
+
expect(attachedMetadata).toEqual({ ...metadata, ext: expectedExtendedMetadata });
+
it('does not modify the base metadata if an extended metadata reference does not exist', async () => {
+
const expectedExtendedMetadata = undefined;
+
const attachedMetadata = handler.attachExtendedMetadata(metadata, expectedExtendedMetadata);
+
expect(attachedMetadata).not.toBeNull();
+
expect(attachedMetadata).toEqual(metadata);
+
it('attaches extended metadata as undefined if a connection failure occurs', async () => {
+
const error = new ProviderError(ProviderFailure.ConnectionFailure);
+
const expectedExtendedMetadata = undefined;
+
const attachedMetadata = handler.attachExtendedMetadata(metadata, error);
+
expect(attachedMetadata).not.toBeNull();
+
expect(attachedMetadata).toEqual({ ...metadata, ext: expectedExtendedMetadata });
+
it('attaches extended metadata as null if the pool metadata is not found', async () => {
+
const error = new ProviderError(ProviderFailure.NotFound);
+
const expectedExtendedMetadata = null;
+
const attachedMetadata = handler.attachExtendedMetadata(metadata, error);
+
expect(attachedMetadata).not.toBeNull();
+
expect(attachedMetadata).toEqual({ ...metadata, ext: expectedExtendedMetadata });
+
describe('getUrlToFetch', () => {
+
it('returns correct url in mode StakePoolMetadataFetchMode.DIRECT', async () => {
+
const expectedUrl = 'happy_url';
+
const generatedUrl = handler.getUrlToFetch(
+
StakePoolMetadataFetchMode.DIRECT,
+
expect(generatedUrl).toEqual(expectedUrl);
+
it('returns correct url in node StakePoolMetadataFetchMode.SMASH', async () => {
+
const smashUrl = 'http://localhost:3100';
+
const poolRegistrationId = 'pool_registration_id';
+
const metadataHash = 'metadata_hash';
+
const expectedUrl = `${smashUrl}/metadata/${poolRegistrationId}/${metadataHash}`;
+
const generatedUrl = handler.getUrlToFetch(
+
StakePoolMetadataFetchMode.SMASH,
+
expect(generatedUrl).toEqual(expectedUrl);
+
it('throws NotImplementedError if an unhandled fetch mode is supplied', async () => {
+
const smashUrl = 'http://localhost:3100';
+
const poolRegistrationId = 'pool_registration_id';
+
const metadataHash = 'metadata_hash';
+
StakePoolMetadataFetchMode['not_a_fetch_mode' as keyof typeof StakePoolMetadataFetchMode],
+
).toThrowError(NotImplementedError);