Skip to content

Commit

Permalink
refractor: improve general code quality (#13)
Browse files Browse the repository at this point in the history
* refractor: remove duplicate type definition

* chore(types): add foreign key fields to types

* refractor: remove unused dependency

* refractor: remove unused module declaration

* feat: add mock for request utility

* chore(tests): add test for utilities and main class

* chore(publish): bump package version to 1.0.4
  • Loading branch information
fabio-nettis committed Mar 28, 2024
1 parent bc815c6 commit c1d3f90
Show file tree
Hide file tree
Showing 10 changed files with 142 additions and 17 deletions.
21 changes: 21 additions & 0 deletions __mocks__/utils/request.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { mock } from "bun:test";

import buildQuery from "utils/query-generator";
import type { APIRequestInit, Entity } from "types/api-entities";

mock.module("utils/request", () => ({
request: async <T extends Entity = any>(
_url: any,
_options: APIRequestInit<T> = {},
) => {
return {
ok: true,
url: `${_url}${
_options.query && Object.keys(_options.query).length
? `?${buildQuery(_options.query)}`
: ""
}`,
json: async () => ({ data: null, error: null, pagination: null }),
};
},
}));
9 changes: 9 additions & 0 deletions __tests__/classes/export.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import "__mocks__/utils/request";

import HellHub from "index";
import { it } from "bun:test";

it("Main class correctly infers types", async () => {
const response = await HellHub.planets(1);
const { data: _ } = await response.json();
});
13 changes: 13 additions & 0 deletions __tests__/utils/query-generator.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { it, expect } from "bun:test";

import buildQuery from "utils/query-generator";
import type { Planet } from "types/api-entities";

it("Query generator works as expected", () => {
const query = buildQuery<Planet[]>({
limit: 10,
filters: { name: { $contains: "earth" } },
});

expect(query).toBe("limit=10&filters[name][contains]=earth");
});
52 changes: 52 additions & 0 deletions __tests__/utils/request-generator.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import "__mocks__/utils/request";

import {
generateDynamicRequestFn,
generateSingleRequestFn,
} from "utils/request-generator";

import { it, expect } from "bun:test";
import type { Planet } from "types/api-entities";

it("SingleRequestFn works as expected", async () => {
const singleRequest = generateSingleRequestFn<Planet>("https://example.com");

const response = await singleRequest({
query: {
limit: 10,
filters: { name: { $contains: "earth" } },
},
});

expect(response.ok).toBe(true);

expect(response.url).toBe(
"https://example.com?limit=10&filters[name][contains]=earth",
);

const json = await response.json();
expect(json).toHaveProperty("data", null);
expect(json).toHaveProperty("error", null);
});

it("DynamicRequestFn works as expected", async () => {
const dynamicRequest = generateDynamicRequestFn<Planet>(
"https://example.com",
);

const response = await dynamicRequest({
limit: 10,
filters: { name: { $contains: "earth" } },
});

expect(response.ok).toBe(true);

expect(response.url).toBe(
"https://example.com?limit=10&filters[name][contains]=earth",
);

const json = await response.json();
expect(json).toHaveProperty("data", null);
expect(json).toHaveProperty("error", null);
expect(json).toHaveProperty("pagination", null);
});
26 changes: 26 additions & 0 deletions __tests__/utils/request.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import "__mocks__/utils/request";

import { it, expect } from "bun:test";
import { request } from "utils/request";
import type { Planet } from "types/api-entities";

it("Request util works as expected", async () => {
const response = await request<Planet[]>("https://example.com", {
query: {
limit: 10,
filters: { name: { $contains: "earth" } },
},
});

expect(response.ok).toBe(true);

expect(response.url).toBe(
"https://example.com?limit=10&filters[name][contains]=earth",
);

expect(await response.json()).toEqual({
data: null,
error: null,
pagination: null as any,
});
});
Binary file modified bun.lockb
Binary file not shown.
5 changes: 1 addition & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"license": "MIT",
"private": false,
"description": "The official SDK for HellHub API. Filter and collect data with full type safety out of the box.",
"version": "1.0.3",
"version": "1.0.4",
"main": "dist/index.mjs",
"types": "dist/index.d.ts",
"keywords": [
Expand Down Expand Up @@ -46,8 +46,5 @@
"author": {
"name": "Fabio Nettis",
"email": "nettisfabio@gmail.com"
},
"dependencies": {
"fast-qs": "^1.0.2"
}
}
15 changes: 15 additions & 0 deletions types/api-entities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,9 @@ export interface Faction extends RemoteEntity {
export interface Planet extends RemoteEntity {
name: string;
owner?: Faction;
ownerId: number;
sector: Sector;
sectorId: number;
health: number;
orders?: Order[];
maxHealth: number;
Expand All @@ -50,18 +52,22 @@ export interface Planet extends RemoteEntity {
positionX: number;
positionY: number;
statistics?: Stat;
statisticId: number;
attacking: Attack[];
defending: Attack[];
campaign?: Campaign;
regeneration: number;
homeWorld?: HomeWorld;
initialOwner?: Faction;
initialOwnerId: number;
globalEvent?: GlobalEvent;
globalEventId: number;
}

export interface GlobalEvent extends RemoteEntity {
title: string;
faction?: Faction;
factionId: number;
message: string;
planets: Planet[];
}
Expand All @@ -70,23 +76,31 @@ export interface Campaign extends RemoteEntity {
type: number;
count: number;
planet?: Planet;
planetId: number;
orders?: Order[];
}

export interface HomeWorld extends RemoteEntity {
faction?: Faction;
factionId: number;
planet?: Planet;
planetId: number;
}

export interface Attack extends RemoteEntity {
target?: Planet;
targetId: number;
source?: Planet;
sourceId: number;
}

export interface Order extends RemoteEntity {
planet?: Planet;
planetId?: number;
faction?: Faction;
factionId?: number;
campaign?: Campaign;
campaignId?: number;
eventType: "DEFEND" | "ATTACK";
health: number;
maxHealth: number;
Expand Down Expand Up @@ -146,6 +160,7 @@ export interface Assignment extends RemoteEntity {
title: string;
briefing: string;
reward?: Reward;
rewardId: number;
progress: number;
expiresAt: string;
description: string;
Expand Down
3 changes: 0 additions & 3 deletions types/fast-qs.ts

This file was deleted.

15 changes: 5 additions & 10 deletions types/query-generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,23 +29,18 @@ export type FieldOperator<T, K extends keyof T> = {
$equals?: T[K];
$in?: Array<T[K]>;
$notIn?: Array<T[K]>;
$lt?: T[K];
$gt?: T[K];
$lte?: T[K];
$gte?: T[K];
} & (T[K] extends string
? {
$search?: T[K];
$contains?: T[K];
$endsWith?: T[K];
$startsWith?: T[K];
$lt?: T[K];
$gt?: T[K];
$lte?: T[K];
$gte?: T[K];
}
: {
$lt?: T[K];
$gt?: T[K];
$lte?: T[K];
$gte?: T[K];
});
: {});

export interface RootOperator<T> {
$or?: Array<Filter<Defined<T>>>;
Expand Down

0 comments on commit c1d3f90

Please sign in to comment.