jest.mock('../../utils/api/normalizeResults', () => { return jest.fn().mockImplementation(() => { return { data: [ { type: 'events', id: '12345', attributes: { event_name: 'Test Event', event_starts_on: '2025-05-01', event_ends_on: '2025-05-05' }, relationships: { divisions: { data: [ { type: 'divisions', id: '67890' } ] }, director: { data: { type: 'director', id: '54321' } } } } ], included: [ { type: 'divisions', id: '67890', attributes: { division_id: '67890', sport_id: '123', stature_id: '456', class_id: '789' } }, { type: 'director', id: '54321', attributes: { director_id: '54321', full_name: 'Test Director' } } ] } }) }) jest.mock('../../utils/api/getSchemaBigQuery', () => { return jest.fn().mockResolvedValue({ classes: { name: 'string', class_id: 'string' }, counties: { name: 'string', county_id: 'string' }, directors: { full_name: 'string', director_id: 'string' }, divisions: { name: 'string', division_id: 'string' }, events: { event_id: 'string', name: 'string', starts_on: 'date', ends_on: 'date' }, seasons: { season_year: 'string', season_id: 'string' }, sports: { name: 'string', short_name: 'string', sport_id: 'string' }, states: { name: 'string', abbreviation: 'string', state_id: 'string' }, statures: { name: 'string', short_name: 'string', stature_id: 'string' } }) }) jest.mock('../../adapters/gcp/bigquery', () => ({ BigQueryAdapter: jest.fn().mockImplementation(() => ({ runQuery: jest.fn().mockResolvedValue([ [ { event_id: '12345', event_name: 'Test Event', event_starts_on: '2025-05-01', event_ends_on: '2025-05-05', division_id: '67890', sport_id: '123', stature_id: '456', class_id: '789', director_id: '54321', full_name: 'Test Director' } ], { pageToken: null, totalRows: '1' } ]), getSchema: jest.fn().mockImplementation(() => { return Promise.resolve({ classes: { name: 'string', class_id: 'string' }, counties: { name: 'string', county_id: 'string' }, directors: { full_name: 'string', director_id: 'string' }, divisions: { name: 'string', division_id: 'string' }, events: { event_id: 'string', name: 'string', starts_on: 'date', ends_on: 'date' }, seasons: { season_year: 'string', season_id: 'string' }, sports: { name: 'string', short_name: 'string', sport_id: 'string' }, states: { name: 'string', abbreviation: 'string', state_id: 'string' }, statures: { name: 'string', short_name: 'string', stature_id: 'string' } }) }) })) })) jest.mock('../../adapters/gcp/firestore', () => ({ FirestoreAdapter: jest.fn().mockImplementation(() => ({ get: jest.fn().mockResolvedValue({ // Mock data for Firestore get call }), getDoc: jest.fn().mockImplementation(async () => { return { id: 'events', relationships: { venue: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'venue_id', table: 'mvw_venues', primaryKey: 'venue_id', }, competitiveClass: { type: 'has-one', foreignKey: 'competitive_class_id', }, lodgingDirector: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'lodging_director_id', table: 'mvw_directors', primaryKey: 'director_id', }, director: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'director_id', table: 'mvw_directors', primaryKey: 'director_id', }, county: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'county_id', table: 'mvw_counties', primaryKey: 'county_id', }, stature: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'stature_id', table: 'mvw_statures', primaryKey: 'stature_id', }, season: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'season_id', table: 'mvw_seasons', primaryKey: 'season_id', }, secondaryDirector: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'secondary_director_id', table: 'mvw_directors', primaryKey: 'director_id', }, fiscalDirector: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'fiscal_director_id', table: 'mvw_directors', primaryKey: 'director_id', }, state: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'state_id', table: 'mvw_states', primaryKey: 'state_id', }, sport: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'sport_id', table: 'mvw_sports', primaryKey: 'sport_id', }, divisions: { repo: 'bigquery', type: 'has-many', dataset: 'data_mart_events', foreignKey: 'event_id', table: 'mvw_divisions', primaryKey: 'division_id', }, }, updated_at: 1711398636643, repo: 'bigquery', dataset: 'data_mart_events', table: 'mvw_events', primaryKey: 'event_id', } }) })) })) import { ApiUtils } from '..' const $api = new ApiUtils() // Define types for request and response objects interface ApiRequest { settings: { requestType: string url: string } body: { fields?: Record filter?: Record includes?: string[] pagination?: { size: number page: number } sort?: Record } path: string params: { entity: string id?: string children?: string } } const req: ApiRequest = { settings: { requestType: 'json-api', url: 'http://localhost:8080/api', }, body: { fields: { events: ['event_id', 'event_name', 'event_starts_on', 'event_ends_on'], divisions: ['division_id', 'sport_id', 'stature_id', 'class_id'], director: ['director_id', 'full_name'], }, filter: { events: { operator: 'equals', field: 'season_year', value: '2025', }, }, includes: ['divisions', 'director'], }, path: '/api/events', params: { entity: 'events', }, } describe('Testing API Utils', () => { describe('getEntityDefinition', () => { test('getEntity for events', async () => { const expected = { id: 'events', relationships: { venue: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'venue_id', table: 'mvw_venues', primaryKey: 'venue_id', }, competitiveClass: { type: 'has-one', foreignKey: 'competitive_class_id', }, lodgingDirector: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'lodging_director_id', table: 'mvw_directors', primaryKey: 'director_id', }, director: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'director_id', table: 'mvw_directors', primaryKey: 'director_id', }, county: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'county_id', table: 'mvw_counties', primaryKey: 'county_id', }, stature: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'stature_id', table: 'mvw_statures', primaryKey: 'stature_id', }, season: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'season_id', table: 'mvw_seasons', primaryKey: 'season_id', }, secondaryDirector: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'secondary_director_id', table: 'mvw_directors', primaryKey: 'director_id', }, fiscalDirector: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'fiscal_director_id', table: 'mvw_directors', primaryKey: 'director_id', }, state: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'state_id', table: 'mvw_states', primaryKey: 'state_id', }, sport: { repo: 'bigquery', type: 'has-one', dataset: 'data_mart_events', foreignKey: 'sport_id', table: 'mvw_sports', primaryKey: 'sport_id', }, divisions: { repo: 'bigquery', type: 'has-many', dataset: 'data_mart_events', foreignKey: 'event_id', table: 'mvw_divisions', primaryKey: 'division_id', }, }, updated_at: 1711398636643, repo: 'bigquery', dataset: 'data_mart_events', table: 'mvw_events', primaryKey: 'event_id', } const result = await $api.getEntityDefinition(req) expect(result).toEqual(expected) }) }) describe('generateResponse', () => { test('generateResponse for events', async () => { const result = await $api.generateResponse(req) expect(result).toBeTruthy() }) test('generateResponse for events as plain json', async () => { const result = await $api.generateResponse({ ...req, settings: { requestType: 'json', url: 'http://localhost:8080/api', }, }) expect(result).toBeTruthy() }) test('generateResponse for events with options', async () => { const result = await $api.generateResponse({ ...req, body: { fields: { county: ['name'], director: ['full_name'], lodgingDirector: ['full_name'], fiscalDirector: ['full_name'], secondaryDirector: ['full_name'], season: ['season_year'], sport: ['name', 'short_name', 'season_starts_on'], state: ['name', 'abbreviation'], stature: ['name', 'short_name'], }, filter: { events: { operator: 'equals', field: 'season_id', value: '29', }, }, includes: [ 'county', 'season', 'sport', 'state', 'stature', 'director', 'lodgingDirector', 'fiscalDirector', ], pagination: { size: 1, page: 2, }, }, }) expect(result).toBeTruthy() }) test('generateResponse for events with options & nested condition', async () => { const result = await $api.generateResponse({ ...req, body: { fields: { events: ['event_id', 'name', 'starts_on', 'ends_on', 'sport_name'], divisions: [ 'division_id', 'name', 'stature_id', 'class_id', 'venue_id', ], }, filter: { events: { and: [ { operator: 'greaterThan', field: 'starts_on', value: '2023-11-30', }, { operator: 'lessOrEquals', field: 'ends_on', value: '2024-12-31', }, { operator: 'includes', field: 'name', value: '%World Series%', }, { or: [ { operator: 'equals', field: 'sport_name', value: 'Baseball', }, { operator: 'equals', field: 'sport_name', value: 'Fastpitch', }, ], }, ], }, }, includes: ['divisions'], sort: { event: ['-starts_on', 'name'], }, }, }) expect(result).toBeTruthy() }) test('generateResponse for event divisions', async () => { const result = await $api.generateResponse({ ...req, body: { filter: { divisions: { operator: 'equals', field: 'event_id', value: '380599', }, }, }, params: { entity: 'events', id: '355555', children: 'divisions', }, }) expect(result).toBeTruthy() }) }) describe('getSchema', () => { test('getSchema for api', async () => { const result = await $api.getSchema(req) expect(result).toHaveProperty('classes') expect(result).toHaveProperty('counties') expect(result).toHaveProperty('directors') expect(result).toHaveProperty('divisions') expect(result).toHaveProperty('events') expect(result).toHaveProperty('seasons') expect(result).toHaveProperty('sports') expect(result).toHaveProperty('states') expect(result).toHaveProperty('statures') }) }) })