Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 91 additions & 1 deletion src/api/namespaces/atomicmarket/handlers/stats.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {initAtomicMarketTest} from '../test';
import {getTestContext} from '../../../../utils/test';
import {getTemplateStatsAction} from './stats';
import {getSchemaStatsByCollectionV2Action, getTemplateStatsAction} from './stats';
import {SaleApiState} from '../index';
import {expect} from 'chai';

Expand Down Expand Up @@ -219,5 +219,95 @@ describe('AtomicMarket Stats API', () => {
});
});

describe('getSchemaStatsByCollectionV2Action', () => {
txit('gets the schema sales and volume for sales with templates', async () => {
await client.createContractReader();

await client.createToken({token_symbol: 'TOKEN1'});
const { collection_name } = await client.createCollection();
const { schema_name } = await client.createSchema({ collection_name });
const { template_id } = await client.createTemplate({ collection_name, schema_name });
const { template_id: templateId2 } = await client.createTemplate({ collection_name, schema_name });

const context = getTestContext(client, {
collection_name,
});

await client.createFullSale({
final_price: 1,
listing_price: 1,
listing_symbol: 'TOKEN1',
settlement_symbol: 'TOKEN1',
state: SaleApiState.SOLD,
taker_marketplace: 'X',
collection_name,
}, {template_id, schema_name});

await client.createFullSale({
final_price: 1,
listing_price: 1,
listing_symbol: 'TOKEN1',
settlement_symbol: 'TOKEN1',
state: SaleApiState.SOLD,
taker_marketplace: 'X',
collection_name,
}, {template_id: templateId2, schema_name});

await client.refreshTemplatePrices();

const response = await getSchemaStatsByCollectionV2Action({symbol: 'TOKEN1'}, context);

expect(response.results.length).to.equal(1);

expect(response.results.find((r: any) => r.schema_name === schema_name)).to.deep.contains({
volume: '2',
sales: '2'
});
});

txit('gets the schema sales and volume for sales without templates', async () => {
await client.createContractReader();

await client.createToken({token_symbol: 'TOKEN1'});
const { collection_name } = await client.createCollection();
const { schema_name } = await client.createSchema({ collection_name });

const context = getTestContext(client, {
collection_name,
});

await client.createFullSale({
final_price: 1,
listing_price: 1,
listing_symbol: 'TOKEN1',
settlement_symbol: 'TOKEN1',
state: SaleApiState.SOLD,
taker_marketplace: 'X',
collection_name,
}, {schema_name});

await client.createFullSale({
final_price: 1,
listing_price: 1,
listing_symbol: 'TOKEN1',
settlement_symbol: 'TOKEN1',
state: SaleApiState.SOLD,
taker_marketplace: 'X',
collection_name,
}, {schema_name});

await client.refreshTemplatePrices();

const response = await getSchemaStatsByCollectionV2Action({symbol: 'TOKEN1'}, context);

expect(response.results.length).to.equal(1);

expect(response.results.find((r: any) => r.schema_name === schema_name)).to.deep.contains({
volume: '2',
sales: '2'
});
});
});

after(async () => await client.end());
});
8 changes: 4 additions & 4 deletions src/api/namespaces/atomicmarket/handlers/stats.ts
Original file line number Diff line number Diff line change
Expand Up @@ -235,11 +235,11 @@ export async function getSchemaStatsByCollectionV2Action(params: RequestValues,
}

const statsQuery = new QueryBuilder(
'SELECT template.schema_name, SUM(price.price) volume, COUNT(*) sales ' +
'FROM atomicmarket_stats_prices_master price, atomicassets_templates "template" '
'SELECT schema.schema_name, SUM(price.price) volume, COUNT(*) sales ' +
'FROM atomicmarket_stats_prices_master price, atomicassets_schemas "schema" '
);

statsQuery.addCondition('price.assets_contract = template.contract AND price.template_id = template.template_id');
statsQuery.addCondition('price.assets_contract = schema.contract AND price.schema_name = schema.schema_name AND price.collection_name = schema.collection_name');

statsQuery.equal('price.market_contract', ctx.coreArgs.atomicmarket_account);
statsQuery.equal('price.symbol', args.symbol);
Expand All @@ -253,7 +253,7 @@ export async function getSchemaStatsByCollectionV2Action(params: RequestValues,
statsQuery.addCondition('price.time < ' + statsQuery.addVariable(args.before) + '::BIGINT');
}

statsQuery.group(['template.contract', 'template.collection_name', 'template.schema_name']);
statsQuery.group(['schema.contract', 'schema.collection_name', 'schema.schema_name']);

const schemaStatsQuery = new QueryBuilder(`
WITH stats AS MATERIALIZED (
Expand Down