Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: number field in rune response #35

Merged
merged 3 commits into from
Jul 29, 2024
Merged
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
1 change: 1 addition & 0 deletions api/src/api/schemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,7 @@ const RuneDetailResponseSchema = Type.Object({
rune: Type.Object(
{
id: RuneIdResponseSchema,
number: RuneNumberResponseSchema,
name: RuneNameResponseSchema,
spaced_name: RuneSpacedNameResponseSchema,
},
Expand Down
2 changes: 2 additions & 0 deletions api/src/api/util/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
return {
rune: {
id: entry.rune_id,
number: entry.number,
name: entry.name,
spaced_name: entry.spaced_name,
},
Expand All @@ -91,6 +92,7 @@
return {
rune: {
id: item.rune_id,
number: item.number,

Check warning on line 95 in api/src/api/util/helpers.ts

View check run for this annotation

Codecov / codecov/patch

api/src/api/util/helpers.ts#L95

Added line #L95 was not covered by tests
name: item.name,
spaced_name: item.spaced_name,
},
Expand Down
8 changes: 4 additions & 4 deletions api/src/pg/pg-store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@
const results = await this.sql<DbCountedQueryResult<DbItemWithRune<DbLedgerEntry>>[]>`
WITH ${cte ? cte : this.sql`none AS (SELECT NULL)`},
results AS (
SELECT l.*, r.name, r.spaced_name, r.divisibility, ${count} AS total
SELECT l.*, r.name, r.number, r.spaced_name, r.divisibility, ${count} AS total
FROM ledger AS l
INNER JOIN runes AS r ON r.id = l.rune_id
WHERE ${filter}
Expand Down Expand Up @@ -222,7 +222,7 @@
): Promise<DbPaginatedResult<DbItemWithRune<DbBalance>>> {
const results = await this.sql<DbCountedQueryResult<DbItemWithRune<DbBalance>>[]>`
WITH grouped AS (
SELECT DISTINCT ON (b.address) b.address, b.balance, b.total_operations, b.rune_id, r.name,
SELECT DISTINCT ON (b.address) b.address, b.balance, b.total_operations, b.rune_id, r.name, r.number

Check warning on line 225 in api/src/pg/pg-store.ts

View check run for this annotation

Codecov / codecov/patch

api/src/pg/pg-store.ts#L225

Added line #L225 was not covered by tests
r.spaced_name, r.divisibility, COUNT(*) OVER() AS total
FROM balance_changes AS b
INNER JOIN runes AS r ON r.id = b.rune_id
Expand All @@ -245,7 +245,7 @@
): Promise<DbItemWithRune<DbBalance> | undefined> {
const results = await this.sql<DbItemWithRune<DbBalance>[]>`
SELECT b.rune_id, b.address, b.balance, b.total_operations, r.name,
r.spaced_name, r.divisibility, COUNT(*) OVER() AS total
r.number, r.spaced_name, r.divisibility, COUNT(*) OVER() AS total

Check warning on line 248 in api/src/pg/pg-store.ts

View check run for this annotation

Codecov / codecov/patch

api/src/pg/pg-store.ts#L248

Added line #L248 was not covered by tests
FROM balance_changes AS b
INNER JOIN runes AS r ON r.id = b.rune_id
WHERE ${runeFilter(this.sql, id, 'r')} AND address = ${address}
Expand All @@ -263,7 +263,7 @@
const results = await this.sql<DbCountedQueryResult<DbItemWithRune<DbBalance>>[]>`
WITH grouped AS (
SELECT DISTINCT ON (b.rune_id) b.address, b.balance, b.total_operations, b.rune_id, r.name,
r.spaced_name, r.divisibility, COUNT(*) OVER() AS total
r.number, r.spaced_name, r.divisibility, COUNT(*) OVER() AS total

Check warning on line 266 in api/src/pg/pg-store.ts

View check run for this annotation

Codecov / codecov/patch

api/src/pg/pg-store.ts#L266

Added line #L266 was not covered by tests
FROM balance_changes AS b
INNER JOIN runes AS r ON r.id = b.rune_id
WHERE address = ${address}
Expand Down
1 change: 1 addition & 0 deletions api/src/pg/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@

export type DbItemWithRune<T> = T & {
name: string;
number: number;

Check warning on line 56 in api/src/pg/types.ts

View check run for this annotation

Codecov / codecov/patch

api/src/pg/types.ts#L56

Added line #L56 was not covered by tests
spaced_name: string;
divisibility: number;
total_operations: number;
Expand Down
163 changes: 102 additions & 61 deletions api/tests/api/api.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
sampleLedgerEntry,
} from '../helpers';

describe('Etchings', () => {
describe('Endpoints', () => {
let db: PgStore;
let fastify: TestFastifyServer;

Expand All @@ -39,72 +39,113 @@ describe('Etchings', () => {
await db.close();
});

test('lists runes', async () => {
const expected = {
divisibility: 0,
id: '1:1',
location: {
block_hash: '0000000000000000000320283a032748cef8227873ff4872689bf23f1cda83a5',
block_height: 840000,
timestamp: 0,
tx_id: '2bb85f4b004be6da54f766c17c1e855187327112c231ef2ff35ebad0ea67c69e',
tx_index: 1,
},
mint_terms: {
amount: '100',
cap: '5000000',
height_end: null,
height_start: null,
offset_end: null,
offset_start: null,
},
name: 'Sample Rune',
number: 1,
spaced_name: 'Sample•Rune',
supply: {
burned: '0',
current: '0',
mint_percentage: '0.0000',
mintable: false,
minted: '0',
premine: '0',
total_burns: '0',
total_mints: '0',
},
symbol: 'ᚠ',
turbo: false,
};
const runesResponse = await fastify.inject({
method: 'GET',
url: '/runes/v1/etchings',
describe('Etchings', () => {
test('lists runes', async () => {
const expected = {
divisibility: 0,
id: '1:1',
location: {
block_hash: '0000000000000000000320283a032748cef8227873ff4872689bf23f1cda83a5',
block_height: 840000,
timestamp: 0,
tx_id: '2bb85f4b004be6da54f766c17c1e855187327112c231ef2ff35ebad0ea67c69e',
tx_index: 1,
},
mint_terms: {
amount: '100',
cap: '5000000',
height_end: null,
height_start: null,
offset_end: null,
offset_start: null,
},
name: 'Sample Rune',
number: 1,
spaced_name: 'Sample•Rune',
supply: {
burned: '0',
current: '0',
mint_percentage: '0.0000',
mintable: false,
minted: '0',
premine: '0',
total_burns: '0',
total_mints: '0',
},
symbol: 'ᚠ',
turbo: false,
};
const runesResponse = await fastify.inject({
method: 'GET',
url: '/runes/v1/etchings',
});
expect(runesResponse.statusCode).toBe(200);
expect(runesResponse.json().results).not.toHaveLength(0);

const response = await fastify.inject({
method: 'GET',
url: '/runes/v1/etchings/' + ledgerEntry.rune_id,
});
expect(response.statusCode).toBe(200);
expect(response.json()).toStrictEqual(expected);
});
expect(runesResponse.statusCode).toBe(200);
expect(runesResponse.json().results).not.toHaveLength(0);

const response = await fastify.inject({
method: 'GET',
url: '/runes/v1/etchings/' + ledgerEntry.rune_id,
test('can fetch by spaced name', async () => {
const url = '/runes/v1/etchings/' + rune.spaced_name;
const response = await fastify.inject({
method: 'GET',
url: url,
});
expect(response.statusCode).toBe(200);
expect(response.json().spaced_name).toEqual(rune.spaced_name);
});
expect(response.statusCode).toBe(200);
expect(response.json()).toStrictEqual(expected);
});

test('can fetch by spaced name', async () => {
const url = '/runes/v1/etchings/' + rune.spaced_name;
const response = await fastify.inject({
method: 'GET',
url: url,
test('can not fetch by spaced name if lacking bullets', async () => {
const url = '/runes/v1/etchings/' + rune.spaced_name.replaceAll('•', '-');
const response = await fastify.inject({
method: 'GET',
url: url,
});
expect(response.statusCode).toBe(400);
});
expect(response.statusCode).toBe(200);
expect(response.json().spaced_name).toEqual(rune.spaced_name);
});

test('can not fetch by spaced name if lacking bullets', async () => {
const url = '/runes/v1/etchings/' + rune.spaced_name.replaceAll('•', '-');
const response = await fastify.inject({
method: 'GET',
url: url,
describe('Transactions', () => {
test('shows details', async () => {
const expected = {
limit: 20,
offset: 0,
results: [
{
address: '0',
amount: '0',
location: {
block_hash: '0000000000000000000320283a032748cef8227873ff4872689bf23f1cda83a5',
block_height: 840000,
output: '2bb85f4b004be6da54f766c17c1e855187327112c231ef2ff35ebad0ea67c69e:0',
timestamp: 0,
tx_id: '2bb85f4b004be6da54f766c17c1e855187327112c231ef2ff35ebad0ea67c69e',
tx_index: 0,
vout: 0,
},
operation: 'etching',
receiver_address: '0',
rune: {
id: '1:1',
name: 'Sample Rune',
number: 1,
spaced_name: 'Sample•Rune',
},
},
],
total: 1,
};
const txid = ledgerEntry.tx_id;
const response = await fastify.inject({
method: 'GET',
url: '/runes/v1/transactions/' + txid + '/activity',
});
expect(response.statusCode).toBe(200);
expect(response.json()).toStrictEqual(expected);
});
expect(response.statusCode).toBe(400);
});
});
Loading