5180 fichiers 38.5 Mo 0 téléchargements 238 vues mis à jour il y a 5 heures ui
nitro-v36-with-renderer-v36 / src / api / catalog / MarketplaceOffers.test.ts
MarketplaceOffers.test.ts 5.1 Ko Télécharger le fichier
import { GetSessionDataManager } from '@octane/renderer';
import { afterEach, describe, expect, it, vi } from 'vitest';
import { MarketplaceOfferData } from './MarketplaceOfferData';
import { MarketPlaceOfferState } from './MarketplaceOfferState';
import {
    filterMarketplaceOwnOffers,
    getMarketplaceListStatusText,
    getMarketplaceOfferText,
    getMarketplaceOwnBottomButton,
    getMarketplaceTimeLeftText,
    isMarketplacePosterOffer,
    MARKETPLACE_SORT_TYPES,
    parseMarketplacePriceInput
} from './MarketplaceOffers';
import { MarketplaceSearchType } from './MarketplaceSearchType';

vi.mock('../utils/LocalizeText', () => ({
    LocalizeText: (key: string) => (key === 'poster_7_name' ? 'Poster seven' : key)
}));

const TEXTS: Record<string, string> = {
    'catalog.marketplace.items_found': '%count% Meubi gevonden!',
    'catalog.marketplace.items_shown': 'Laat de eerste %count% meubels zien',
    'catalog.marketplace.no_items': 'Geen Meubi gevonden',
    'catalog.marketplace.offer.time_left': 'Tijd over: %time%',
    'catalog.marketplace.offer.hours': 'uur',
    'catalog.marketplace.offer.minutes': 'minuten'
};

const localize = (key: string) => TEXTS[key] ?? key;

const offer = (furniType: number, furniId: number, extraData = '') => new MarketplaceOfferData(1, furniId, furniType, extraData, null, 10, 1, 0);

const withFurniData = (floor: Record<number, object>, wall: Record<number, object> = {}) =>
    vi.mocked(GetSessionDataManager).mockReturnValue({
        getFloorItemData: (id: number) => floor[id] ?? null,
        getWallItemData: (id: number) => wall[id] ?? null
    } as never);

afterEach(() => {
    vi.mocked(GetSessionDataManager).mockReset();
});

describe('MarketplaceOffers', () => {
    it('offers the AIR sort types per search tab', () => {
        expect(MARKETPLACE_SORT_TYPES[MarketplaceSearchType.BY_ACTIVITY]).toEqual([3, 4, 5, 6]);
        expect(MARKETPLACE_SORT_TYPES[MarketplaceSearchType.BY_VALUE]).toEqual([1, 2]);
        expect(MARKETPLACE_SORT_TYPES[MarketplaceSearchType.ADVANCED]).toEqual([1, 2, 3, 4, 5, 6]);
    });

    it('reads an empty price input as no limit', () => {
        expect(parseMarketplacePriceInput('')).toBe(-1);
        expect(parseMarketplacePriceInput('25')).toBe(25);
        expect(parseMarketplacePriceInput('0')).toBe(0);
    });

    it('builds the status line like updateStatusDisplay', () => {
        expect(getMarketplaceListStatusText(localize, 0, 0)).toBe('Geen Meubi gevonden');
        expect(getMarketplaceListStatusText(localize, 3, 3)).toBe('3 Meubi gevonden!');
        expect(getMarketplaceListStatusText(localize, 500, 812)).toBe('812 Meubi gevonden!. Laat de eerste 500 meubels zien.');
    });

    it('splits the time left into hours and minutes', () => {
        expect(getMarketplaceTimeLeftText(localize, 0)).toBe('Tijd over: 1 minuten');
        expect(getMarketplaceTimeLeftText(localize, 59)).toBe('Tijd over: 59 minuten');
        expect(getMarketplaceTimeLeftText(localize, 2881)).toBe('Tijd over: 48 uur 1 minuten');
    });

    it('filters the own offers by category and search text', () => {
        const offers = [
            { status: MarketPlaceOfferState.ONGOING, name: 'Throne' },
            { status: MarketPlaceOfferState.SOLD, name: 'Throne' },
            { status: MarketPlaceOfferState.ONGOING, name: 'Club sofa' }
        ];

        expect(filterMarketplaceOwnOffers(offers, MarketPlaceOfferState.ONGOING, '', (value) => value.name)).toHaveLength(2);
        expect(filterMarketplaceOwnOffers(offers, MarketPlaceOfferState.ONGOING, 'sofa', (value) => value.name)).toEqual([offers[2]]);
        expect(filterMarketplaceOwnOffers(offers, MarketPlaceOfferState.SOLD, '', (value) => value.name)).toEqual([offers[1]]);
        expect(getMarketplaceOwnBottomButton(MarketPlaceOfferState.ONGOING)).toBe('recall');
        expect(getMarketplaceOwnBottomButton(MarketPlaceOfferState.EXPIRED)).toBe('seen');
    });

    it('names an offer from furnidata instead of the raw roomItem key', () => {
        withFurniData({ 2270: { className: 'throne', name: 'Throne', description: 'Important Habbos only' } });

        expect(getMarketplaceOfferText(offer(MarketplaceOfferData.TYPE_FLOOR, 2270), 'name')).toBe('Throne');
        expect(getMarketplaceOfferText(offer(MarketplaceOfferData.TYPE_FLOOR, 2270), 'desc')).toBe('Important Habbos only');
    });

    it('falls back to the class name, never the key', () => {
        withFurniData({ 9: { className: 'rare_dragonlamp', name: '', description: '' } });

        expect(getMarketplaceOfferText(offer(MarketplaceOfferData.TYPE_FLOOR, 9), 'name')).toBe('rare_dragonlamp');
        expect(getMarketplaceOfferText(offer(MarketplaceOfferData.TYPE_FLOOR, 404), 'name')).toBe('');
    });

    it('uses poster_<id>_name for a poster offer', () => {
        withFurniData({}, { 4001: { className: 'poster', name: 'Poster', description: '' } });

        const poster = offer(MarketplaceOfferData.TYPE_WALL, 4001, '7');

        expect(isMarketplacePosterOffer(poster)).toBe(true);
        expect(getMarketplaceOfferText(poster, 'name')).toBe('Poster seven');
        expect(isMarketplacePosterOffer(offer(MarketplaceOfferData.TYPE_WALL, 4001))).toBe(false);
    });
});
15Sujets
1Dépôts
20Membres
2En ligne
Profile
Inscrit
Dernière visite
Messages
0
Votes positifs
0
Votes négatifs
0

Nous utilisons des cookies pour assurer le bon fonctionnement du site et améliorer votre expérience. en savoir plus

Autoriser