import { describe, it, expect } from 'vitest' import { sports } from './fixtures' import createI18n from '@/i18n' import { ISport, TActiveStatus } from '@/types/sports' import { translateSports } from '@/utils/sports' const { t, locale } = createI18n.global interface IInputParam { sports: ISport[] locale: string activeStatus: TActiveStatus sportsToInclude: number[] } interface ITestParameter { description: string inputParams: IInputParam expected: Record[] } describe('translateSports', () => { const testsParams: ITestParameter[] = [ { description: "returns sorted all translated sports (with 'en' locale)", inputParams: { sports, locale: 'en', activeStatus: 'all', sportsToInclude: [], }, expected: [ { color: null, has_workouts: false, id: 1, img: '/img/sports/cycling-sport.png', is_active: true, is_active_for_user: true, label: 'Cycling (Sport)', stopped_speed_threshold: 1, translatedLabel: 'Cycling (Sport)', }, { color: '#000000', has_workouts: true, id: 2, img: '/img/sports/cycling-transport.png', is_active: false, is_active_for_user: false, label: 'Cycling (Transport)', stopped_speed_threshold: 1, translatedLabel: 'Cycling (Transport)', }, { color: null, has_workouts: true, id: 3, img: '/img/sports/hiking.png', is_active: true, is_active_for_user: false, label: 'Hiking', stopped_speed_threshold: 0.1, translatedLabel: 'Hiking', }, ], }, { description: "returns sorted only active translated sports (with 'en' locales)", inputParams: { sports, locale: 'en', activeStatus: 'is_active', sportsToInclude: [], }, expected: [ { color: null, has_workouts: false, id: 1, img: '/img/sports/cycling-sport.png', is_active: true, is_active_for_user: true, label: 'Cycling (Sport)', stopped_speed_threshold: 1, translatedLabel: 'Cycling (Sport)', }, { color: null, has_workouts: true, id: 3, img: '/img/sports/hiking.png', is_active: true, is_active_for_user: false, label: 'Hiking', stopped_speed_threshold: 0.1, translatedLabel: 'Hiking', }, ], }, { description: "returns sorted translated sports active for user (with 'en' locales)", inputParams: { sports, locale: 'en', activeStatus: 'is_active_for_user', sportsToInclude: [], }, expected: [ { color: null, has_workouts: false, id: 1, img: '/img/sports/cycling-sport.png', is_active: true, is_active_for_user: true, label: 'Cycling (Sport)', stopped_speed_threshold: 1, translatedLabel: 'Cycling (Sport)', }, ], }, { description: "returns empty array if not sports (with 'en' locale)", inputParams: { sports: [], locale: 'en', activeStatus: 'all', sportsToInclude: [], }, expected: [], }, { description: "returns sorted all translated sports (with 'fr' locale)", inputParams: { sports, locale: 'fr', activeStatus: 'all', sportsToInclude: [], }, expected: [ { color: null, has_workouts: true, id: 3, img: '/img/sports/hiking.png', is_active: true, is_active_for_user: false, label: 'Hiking', stopped_speed_threshold: 0.1, translatedLabel: 'Randonnée', }, { color: null, has_workouts: false, id: 1, img: '/img/sports/cycling-sport.png', is_active: true, is_active_for_user: true, label: 'Cycling (Sport)', stopped_speed_threshold: 1, translatedLabel: 'Vélo (Sport)', }, { color: '#000000', has_workouts: true, id: 2, img: '/img/sports/cycling-transport.png', is_active: false, is_active_for_user: false, label: 'Cycling (Transport)', stopped_speed_threshold: 1, translatedLabel: 'Vélo (Transport)', }, ], }, { description: "returns sorted only active translated sports (with 'fr' locales)", inputParams: { sports, locale: 'fr', activeStatus: 'is_active', sportsToInclude: [], }, expected: [ { color: null, has_workouts: true, id: 3, img: '/img/sports/hiking.png', is_active: true, is_active_for_user: false, label: 'Hiking', stopped_speed_threshold: 0.1, translatedLabel: 'Randonnée', }, { color: null, has_workouts: false, id: 1, img: '/img/sports/cycling-sport.png', is_active: true, is_active_for_user: true, label: 'Cycling (Sport)', stopped_speed_threshold: 1, translatedLabel: 'Vélo (Sport)', }, ], }, { description: "returns sorted translated sports, active for user (with 'fr' locales)", inputParams: { sports, locale: 'fr', activeStatus: 'is_active_for_user', sportsToInclude: [], }, expected: [ { color: null, has_workouts: false, id: 1, img: '/img/sports/cycling-sport.png', is_active: true, is_active_for_user: true, label: 'Cycling (Sport)', stopped_speed_threshold: 1, translatedLabel: 'Vélo (Sport)', }, ], }, { description: "returns empty array if not sports (with 'fr' locale)", inputParams: { sports: [], locale: 'fr', activeStatus: 'all', sportsToInclude: [], }, expected: [], }, { description: "returns sorted all translated sports, even with user sports list provided (with 'en' locale)", inputParams: { sports, locale: 'en', activeStatus: 'all', sportsToInclude: [2], }, expected: [ { color: null, has_workouts: false, id: 1, img: '/img/sports/cycling-sport.png', is_active: true, is_active_for_user: true, label: 'Cycling (Sport)', stopped_speed_threshold: 1, translatedLabel: 'Cycling (Sport)', }, { color: '#000000', has_workouts: true, id: 2, img: '/img/sports/cycling-transport.png', is_active: false, is_active_for_user: false, label: 'Cycling (Transport)', stopped_speed_threshold: 1, translatedLabel: 'Cycling (Transport)', }, { color: null, has_workouts: true, id: 3, img: '/img/sports/hiking.png', is_active: true, is_active_for_user: false, label: 'Hiking', stopped_speed_threshold: 0.1, translatedLabel: 'Hiking', }, ], }, { description: "returns sorted only translated sports active on application and sports with user workouts (with 'en' locales)", inputParams: { sports, locale: 'en', activeStatus: 'is_active', sportsToInclude: [2], }, expected: [ { color: null, has_workouts: false, id: 1, img: '/img/sports/cycling-sport.png', is_active: true, is_active_for_user: true, label: 'Cycling (Sport)', stopped_speed_threshold: 1, translatedLabel: 'Cycling (Sport)', }, { color: '#000000', has_workouts: true, id: 2, img: '/img/sports/cycling-transport.png', is_active: false, is_active_for_user: false, label: 'Cycling (Transport)', stopped_speed_threshold: 1, translatedLabel: 'Cycling (Transport)', }, { color: null, has_workouts: true, id: 3, img: '/img/sports/hiking.png', is_active: true, is_active_for_user: false, label: 'Hiking', stopped_speed_threshold: 0.1, translatedLabel: 'Hiking', }, ], }, { description: "returns empty array, with user sports list provided (with 'en' locale)", inputParams: { sports: [], locale: 'en', activeStatus: 'all', sportsToInclude: [2], }, expected: [], }, { description: "returns sorted all translated sports, even with user sports list provided (with 'fr' locale)", inputParams: { sports, locale: 'fr', activeStatus: 'all', sportsToInclude: [2], }, expected: [ { color: null, has_workouts: true, id: 3, img: '/img/sports/hiking.png', is_active: true, is_active_for_user: false, label: 'Hiking', stopped_speed_threshold: 0.1, translatedLabel: 'Randonnée', }, { color: null, has_workouts: false, id: 1, img: '/img/sports/cycling-sport.png', is_active: true, is_active_for_user: true, label: 'Cycling (Sport)', stopped_speed_threshold: 1, translatedLabel: 'Vélo (Sport)', }, { color: '#000000', has_workouts: true, id: 2, img: '/img/sports/cycling-transport.png', is_active: false, is_active_for_user: false, label: 'Cycling (Transport)', stopped_speed_threshold: 1, translatedLabel: 'Vélo (Transport)', }, ], }, { description: "returns sorted only translated sports active on application and sports with user workouts (with 'fr' locales)", inputParams: { sports, locale: 'fr', activeStatus: 'is_active', sportsToInclude: [2], }, expected: [ { color: null, has_workouts: true, id: 3, img: '/img/sports/hiking.png', is_active: true, is_active_for_user: false, label: 'Hiking', stopped_speed_threshold: 0.1, translatedLabel: 'Randonnée', }, { color: null, has_workouts: false, id: 1, img: '/img/sports/cycling-sport.png', is_active: true, is_active_for_user: true, label: 'Cycling (Sport)', stopped_speed_threshold: 1, translatedLabel: 'Vélo (Sport)', }, { color: '#000000', has_workouts: true, id: 2, img: '/img/sports/cycling-transport.png', is_active: false, is_active_for_user: false, label: 'Cycling (Transport)', stopped_speed_threshold: 1, translatedLabel: 'Vélo (Transport)', }, ], }, { description: "returns empty array, with user sports list provided (with 'fr' locale)", inputParams: { sports: [], locale: 'fr', activeStatus: 'all', sportsToInclude: [2], }, expected: [], }, ] testsParams.map((testParams) => { it(testParams.description, () => { locale.value = testParams.inputParams.locale expect( translateSports( testParams.inputParams.sports, t, testParams.inputParams.activeStatus, testParams.inputParams.sportsToInclude ) ).toStrictEqual(testParams.expected) }) }) })