From 13c99fb84d3b2af7e516f418786b51c4e984b920 Mon Sep 17 00:00:00 2001 From: Jacob Date: Tue, 27 Aug 2024 21:38:31 +0800 Subject: [PATCH] code --- src/API/getSkyblockAuction.test.ts | 117 ++++++++++++++++++++----- src/API/getSkyblockAuction.ts | 25 +----- src/API/getSkyblockAuctionsByPlayer.ts | 2 +- src/utils/Player.test.ts | 100 +++++++++++++++++++++ src/utils/oscillation.test.ts | 18 ++++ src/utils/oscillation.ts | 7 +- 6 files changed, 219 insertions(+), 50 deletions(-) create mode 100644 src/utils/Player.test.ts create mode 100644 src/utils/oscillation.test.ts diff --git a/src/API/getSkyblockAuction.test.ts b/src/API/getSkyblockAuction.test.ts index 04e90e27..75b29cea 100644 --- a/src/API/getSkyblockAuction.test.ts +++ b/src/API/getSkyblockAuction.test.ts @@ -22,7 +22,7 @@ test('getSkyblockAuction (No Query)', () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - expect(() => client.getSkyblockAuction('player', '')).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + expect(() => client.getSkyblockAuction('auction', '')).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); client.destroy(); }); @@ -62,17 +62,8 @@ test('getSkyblockAuction (Auction)', async () => { expect(auction.bin).toBeDefined(); expectTypeOf(auction.bin).toEqualTypeOf(); expect(auction.itemBytes).toBeDefined(); + expect(auction.itemBytes).toBeNull(); expectTypeOf(auction.itemBytes).toEqualTypeOf(); - if (auction.itemBytes) { - expect(auction.itemBytes).toBeDefined(); - expectTypeOf(auction.itemBytes).toEqualTypeOf(); - expect(auction.itemBytes.bytesBuffer).toBeDefined(); - expectTypeOf(auction.itemBytes.bytesBuffer).toEqualTypeOf(); - expect(auction.itemBytes.base64).toBeDefined(); - expectTypeOf(auction.itemBytes.base64).toEqualTypeOf<() => string>(); - expect(auction.itemBytes.base64()).toBeDefined(); - expectTypeOf(auction.itemBytes.base64()).toEqualTypeOf(); - } expect(auction.coop).toBeDefined(); expectTypeOf(auction.coop).toEqualTypeOf(); expect(auction.auctionStartTimestamp).toBeDefined(); @@ -157,18 +148,9 @@ test('getSkyblockAuction (Player)', async () => { expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); expect(auction.bin).toBeDefined(); expectTypeOf(auction.bin).toEqualTypeOf(); + expect(auction.itemBytes).toBeNull(); expect(auction.itemBytes).toBeDefined(); expectTypeOf(auction.itemBytes).toEqualTypeOf(); - if (auction.itemBytes) { - expect(auction.itemBytes).toBeDefined(); - expectTypeOf(auction.itemBytes).toEqualTypeOf(); - expect(auction.itemBytes.bytesBuffer).toBeDefined(); - expectTypeOf(auction.itemBytes.bytesBuffer).toEqualTypeOf(); - expect(auction.itemBytes.base64).toBeDefined(); - expectTypeOf(auction.itemBytes.base64).toEqualTypeOf<() => string>(); - expect(auction.itemBytes.base64()).toBeDefined(); - expectTypeOf(auction.itemBytes.base64()).toEqualTypeOf(); - } expect(auction.coop).toBeDefined(); expectTypeOf(auction.coop).toEqualTypeOf(); expect(auction.auctionStartTimestamp).toBeDefined(); @@ -237,6 +219,95 @@ test('getSkyblockAuction (Profile)', async () => { expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + expect(data.length).greaterThanOrEqual(0); + expectTypeOf(data.length).toEqualTypeOf(); + data.forEach((auction: Auction) => { + expect(auction).toBeDefined(); + expect(auction).toBeInstanceOf(Auction); + expectTypeOf(auction).toEqualTypeOf(); + expect(auction.auctionId).toBeDefined(); + expectTypeOf(auction.auctionId).toEqualTypeOf(); + expect(auction.auctioneerUuid).toBeDefined(); + expectTypeOf(auction.auctioneerUuid).toEqualTypeOf(); + expect(auction.auctioneerProfile).toBeDefined(); + expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); + expect(auction.bin).toBeDefined(); + expectTypeOf(auction.bin).toEqualTypeOf(); + expect(auction.itemBytes).toBeDefined(); + expect(auction.itemBytes).toBeNull(); + expectTypeOf(auction.itemBytes).toEqualTypeOf(); + expect(auction.coop).toBeDefined(); + expectTypeOf(auction.coop).toEqualTypeOf(); + expect(auction.auctionStartTimestamp).toBeDefined(); + expect(auction.auctionStartTimestamp).greaterThanOrEqual(0); + expectTypeOf(auction.auctionStartTimestamp).toEqualTypeOf(); + expect(auction.auctionStart).toBeDefined(); + expectTypeOf(auction.auctionStart).toEqualTypeOf(); + expect(auction.auctionEndTimestamp).toBeDefined(); + expectTypeOf(auction.auctionEndTimestamp).toEqualTypeOf(); + expect(auction.auctionEnd).toBeDefined(); + expectTypeOf(auction.auctionEnd).toEqualTypeOf(); + expect(auction.item).toBeDefined(); + expectTypeOf(auction.item).toEqualTypeOf(); + expect(auction.itemLore).toBeDefined(); + expectTypeOf(auction.itemLore).toEqualTypeOf(); + expect(auction.itemLoreRaw).toBeDefined(); + expectTypeOf(auction.itemLoreRaw).toEqualTypeOf(); + expect(auction.rarity).toBeDefined(); + expectTypeOf(auction.rarity).toEqualTypeOf(); + expect(auction.startingBid).toBeDefined(); + expectTypeOf(auction.startingBid).toEqualTypeOf(); + expect(auction.highestBid).toBeDefined(); + expectTypeOf(auction.highestBid).toEqualTypeOf(); + expect(auction.bids).toBeDefined(); + expectTypeOf(auction.bids).toEqualTypeOf(); + auction.bids.forEach((bid: Bid) => { + expect(bid).toBeDefined(); + expect(bid).toBeInstanceOf(Bid); + expectTypeOf(bid).toEqualTypeOf(); + expect(bid.auctionId).toBeDefined(); + expectTypeOf(bid.auctionId).toEqualTypeOf(); + expect(bid.profileId).toBeDefined(); + expectTypeOf(bid.profileId).toEqualTypeOf(); + expect(bid.amount).toBeDefined(); + expect(bid.amount).greaterThanOrEqual(0); + expectTypeOf(bid.amount).toEqualTypeOf(); + expect(bid.timestamp).toBeDefined(); + expectTypeOf(bid.timestamp).toEqualTypeOf(); + expect(bid.at).toBeDefined(); + expectTypeOf(bid.at).toEqualTypeOf(); + expect(bid.bidder).toBeDefined(); + expectTypeOf(bid.bidder).toEqualTypeOf(); + expect(bid.toString()).toBeDefined(); + expect(bid.toString()).toBe(`${bid.bidder} bid ${bid.amount} coins`); + expectTypeOf(bid.toString()).toEqualTypeOf(); + }); + expect(auction.claimed).toBeDefined(); + expectTypeOf(auction.claimed).toEqualTypeOf(); + expect(auction.claimedBidders).toBeDefined(); + expectTypeOf(auction.claimedBidders).toEqualTypeOf(); + expect(auction.toString()).toBeDefined(); + expect(auction.toString()).toEqual(auction.item); + expectTypeOf(auction.toString()).toEqualTypeOf(); + }); + client.destroy(); +}); + +test('getSkyblockAuction (Include Item Bytes)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + const auctions = await client.getSkyblockAuctions(1); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + const data = await client.getSkyblockAuction('profile', auctions.auctions[0].auctioneerProfile, { + includeItemBytes: true + }); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); expect(data.length).greaterThanOrEqual(0); @@ -255,9 +326,9 @@ test('getSkyblockAuction (Profile)', async () => { expectTypeOf(auction.bin).toEqualTypeOf(); expect(auction.itemBytes).toBeDefined(); expectTypeOf(auction.itemBytes).toEqualTypeOf(); + expect(auction.itemBytes).toBeDefined(); if (auction.itemBytes) { - expect(auction.itemBytes).toBeDefined(); - expectTypeOf(auction.itemBytes).toEqualTypeOf(); + expect(auction.itemBytes).instanceOf(ItemBytes); expect(auction.itemBytes.bytesBuffer).toBeDefined(); expectTypeOf(auction.itemBytes.bytesBuffer).toEqualTypeOf(); expect(auction.itemBytes.base64).toBeDefined(); diff --git a/src/API/getSkyblockAuction.ts b/src/API/getSkyblockAuction.ts index 71ee5543..ded8e489 100644 --- a/src/API/getSkyblockAuction.ts +++ b/src/API/getSkyblockAuction.ts @@ -26,30 +26,7 @@ class getSkyblockAction extends Endpoint { } else { throw new Error(this.client.errors.BAD_AUCTION_FILTER); } - if (!query) { - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - console.log('aaaaaaaaaaaaaaaaaaaaaaaaa'); - throw new Error(this.client.errors.NO_NICKNAME_UUID); - } + if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); const res = await this.client.requests.request(`/skyblock/auction?${filter}=${query}`, options); if (res.options.raw) return res.data; return res.data.auctions.map((a: any) => new Auction(a, options?.includeItemBytes ?? false)); diff --git a/src/API/getSkyblockAuctionsByPlayer.ts b/src/API/getSkyblockAuctionsByPlayer.ts index 7f482a27..a05afdbc 100644 --- a/src/API/getSkyblockAuctionsByPlayer.ts +++ b/src/API/getSkyblockAuctionsByPlayer.ts @@ -13,7 +13,7 @@ class getSkyblockActionsByPlayer extends Endpoint { async execute(query: string, options?: AuctionRequestOptions): Promise { if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); query = await this.client.requests.toUUID(query); - const res = await this.client.requests.request(`/skyblock/auction?player=${query}`); + const res = await this.client.requests.request(`/skyblock/auction?player=${query}`, options); if (res.options.raw) return res.data; return res.data.auctions.map((a: any) => new Auction(a, options?.includeItemBytes ?? false)); } diff --git a/src/utils/Player.test.ts b/src/utils/Player.test.ts new file mode 100644 index 00000000..b7dee081 --- /dev/null +++ b/src/utils/Player.test.ts @@ -0,0 +1,100 @@ +/* eslint-disable camelcase */ +import { + parseClaimedRewards, + playerLevelProgress, + getSocialMedia, + getPlayerLevel, + xpToNextLevel, + levelToXP, + getRank +} from '../utils/Player'; +import { describe, expect, test } from 'vitest'; + +test('getRank', () => { + expect(getRank({ prefix: '[EVENTS]' })).toBe('Events'); + expect(getRank({ prefix: '[MOJANG]' })).toBe('Mojang'); + expect(getRank({ prefix: '[PIG+++]' })).toBe('PIG+++'); + expect(getRank({ prefix: '[INNIT]' })).toBe('Innit'); + expect(getRank({ prefix: '[meow]' })).toBe('Default'); + + expect(getRank({ rank: 'ADMIN' })).toBe('Admin'); + expect(getRank({ rank: 'GAME_MASTER' })).toBe('Game Master'); + expect(getRank({ rank: 'Meow' })).toBe('Default'); + + expect(getRank({ newPackageRank: 'MVP_PLUS', monthlyPackageRank: 'SUPERSTAR' })).toBe('MVP++'); + expect(getRank({ newPackageRank: 'MVP_PLUS', monthlyPackageRank: 'Meow' })).toBe('MVP+'); + expect(getRank({ newPackageRank: 'MVP' })).toBe('MVP'); + expect(getRank({ newPackageRank: 'VIP_PLUS' })).toBe('VIP+'); + expect(getRank({ newPackageRank: 'VIP' })).toBe('VIP'); + expect(getRank({ newPackageRank: 'meow' })).toBe('Default'); +}); + +test('getPlayerLevel', () => { + describe('should calculate the player level correctly', () => { + const exp = 10000; + expect(getPlayerLevel(exp)).toBe(1); + }); +}); + +test('xpToNextLevel', () => { + describe('should calculate the XP required for the next level correctly', () => { + const xp = 10000; + expect(xpToNextLevel(xp)).toBe(25000); + }); + + describe('should return 10000 if the XP is less than 10000', () => { + const xp = 5000; + expect(xpToNextLevel(xp)).toBe(10000); + }); +}); + +test('levelToXP', () => { + describe('should calculate the XP required for a given level correctly', () => { + const level = 2; + expect(levelToXP(level)).toBe(20000); + }); +}); + +test('playerLevelProgress', () => { + describe('should calculate the player level progress correctly', () => { + const xp = 15000; + const expectedProgress = { + xpToNext: 37500, + remainingXP: 22500, + currentXP: 12500, + percent: 33.33, + percentRemaining: 66.67 + }; + expect(playerLevelProgress(xp)).toEqual(expectedProgress); + }); +}); + +test('getSocialMedia', () => { + describe('should return the formatted social media links', () => { + const data = { + links: { + TWITTER: 'https://twitter.com/example', + YOUTUBE: 'https://youtube.com/example', + INSTAGRAM: 'https://instagram.com/example' + } + }; + const expectedSocialMedia = [ + { name: 'Twitter', link: 'https://twitter.com/example', id: 'TWITTER' }, + { name: 'YouTube', link: 'https://youtube.com/example', id: 'YOUTUBE' }, + { name: 'Instagram', link: 'https://instagram.com/example', id: 'INSTAGRAM' } + ]; + expect(getSocialMedia(data)).toEqual(expectedSocialMedia); + }); +}); + +test('parseClaimedRewards', () => { + describe('should parse the claimed rewards correctly', () => { + const data = { + levelingReward_1: true, + levelingReward_3: true, + levelingReward_5: true + }; + const expectedRewards = [1, 3, 5]; + expect(parseClaimedRewards(data)).toEqual(expectedRewards); + }); +}); diff --git a/src/utils/oscillation.test.ts b/src/utils/oscillation.test.ts new file mode 100644 index 00000000..113db1e7 --- /dev/null +++ b/src/utils/oscillation.test.ts @@ -0,0 +1,18 @@ +import { expect, test } from 'vitest'; +import { monthAB } from './oscillation'; + +test('oscillation', () => { + expect(monthAB(0)).toBe('b'); + expect(monthAB(1)).toBe('a'); + expect(monthAB(2)).toBe('b'); + expect(monthAB(3)).toBe('a'); + expect(monthAB(4)).toBe('b'); + expect(monthAB(5)).toBe('a'); + expect(monthAB(6)).toBe('b'); + expect(monthAB(7)).toBe('a'); + expect(monthAB(8)).toBe('b'); + expect(monthAB(9)).toBe('a'); + expect(monthAB(10)).toBe('b'); + expect(monthAB(11)).toBe('a'); + expect(monthAB(12)).toBe('b'); +}); diff --git a/src/utils/oscillation.ts b/src/utils/oscillation.ts index b6f4028f..d654ffb9 100644 --- a/src/utils/oscillation.ts +++ b/src/utils/oscillation.ts @@ -2,8 +2,11 @@ // Month oscillation started in December 2014, so every month that is pair ( odd in js!! ) is month A // Weekly oscillation started... just refer to the code in the docs const weeklyOscillationStart = 1417237200000; -export function monthAB() { - return new Date().getMonth() % 2 ? 'a' : 'b'; +export function monthAB(month?: number) { + if (month === undefined) { + month = new Date().getMonth(); + } + return month % 2 ? 'a' : 'b'; } export function weekAB() {