Skip to content

Commit 2951c3a

Browse files
committed
test: Enhance prayer times service tests with additional parameters and mock responses
1 parent bf28b84 commit 2951c3a

4 files changed

Lines changed: 195 additions & 11 deletions

File tree

src/prayer-times/controllers/prayer-times.controller.spec.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,8 @@ describe('PrayerTimesController', () => {
8787
expect(prayerTimesService.getPrayerTimes).toHaveBeenCalledWith(
8888
51.5074,
8989
-0.1278,
90-
2025,
91-
7,
92-
2,
9390
1,
94-
{ method: 2 },
91+
{ method: 2, year: 2025, month: 7 },
9592
);
9693
});
9794

src/prayer-times/dtos/prayer-times.dto.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { IsOptional, IsInt, IsNumber, IsNotEmpty } from 'class-validator';
1+
import { IsOptional, IsInt } from 'class-validator';
22
import { LocationDto } from '@/prayer-times/dtos/location.dto';
33
import { Type } from 'class-transformer';
44

Lines changed: 134 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,151 @@
11
import { Test, TestingModule } from '@nestjs/testing';
22
import { AladhanService } from './aladhan.service';
3-
import { HttpModule } from '@nestjs/axios';
3+
import { HttpService } from '@nestjs/axios';
4+
import { of } from 'rxjs';
5+
import { AxiosResponse } from 'axios';
46

57
describe('AladhanService', () => {
68
let service: AladhanService;
9+
let httpService: HttpService;
10+
11+
const mockAladhanResponseData = {
12+
data: {
13+
'1': [
14+
{
15+
date: { timestamp: '01 Jan 2025' },
16+
meta: {
17+
timezone: 'Asia/Riyadh',
18+
location: { latitude: 24.7136, longitude: 46.6753 },
19+
},
20+
timings: {
21+
Fajr: '2025-01-01T05:23:00+03:00',
22+
Sunrise: '2025-01-01T06:46:00+03:00',
23+
Dhuhr: '2025-01-01T12:04:00+03:00',
24+
Asr: '2025-01-01T15:15:00+03:00',
25+
Sunset: '2025-01-01T17:23:00+03:00',
26+
Maghrib: '2025-01-01T17:23:00+03:00',
27+
Isha: '2025-01-01T18:53:00+03:00',
28+
Imsak: '2025-01-01T05:13:00+03:00',
29+
Midnight: '2025-01-02T00:04:00+03:00',
30+
Firstthird: '2025-01-01T21:24:00+03:00',
31+
Lastthird: '2025-01-02T02:45:00+03:00',
32+
},
33+
},
34+
],
35+
},
36+
};
37+
38+
const mockAxiosResponse: AxiosResponse = {
39+
data: mockAladhanResponseData,
40+
status: 200,
41+
statusText: 'OK',
42+
headers: {},
43+
config: {} as any,
44+
};
745

846
beforeEach(async () => {
947
const module: TestingModule = await Test.createTestingModule({
10-
imports: [HttpModule],
11-
providers: [AladhanService],
48+
providers: [
49+
AladhanService,
50+
{
51+
provide: HttpService,
52+
useValue: {
53+
get: jest.fn(),
54+
},
55+
},
56+
],
1257
}).compile();
1358

1459
service = module.get<AladhanService>(AladhanService);
60+
httpService = module.get<HttpService>(HttpService);
1561
});
1662

1763
it('should be defined', () => {
1864
expect(service).toBeDefined();
1965
});
66+
67+
describe('getPrayerTimes', () => {
68+
it('should fetch prayer times with basic parameters', async () => {
69+
jest.spyOn(httpService, 'get').mockReturnValue(of(mockAxiosResponse));
70+
71+
const result = await service.getPrayerTimes(24.7136, 46.6753, {
72+
method: 3,
73+
});
74+
75+
expect(httpService.get).toHaveBeenCalledWith(
76+
'https://api.aladhan.com/v1/calendar',
77+
{
78+
params: {
79+
latitude: 24.7136,
80+
longitude: 46.6753,
81+
iso8601: true,
82+
annual: true,
83+
method: 3,
84+
},
85+
},
86+
);
87+
88+
expect(result.timezone).toBe('Asia/Riyadh');
89+
expect(result.location).toEqual({
90+
latitude: 24.7136,
91+
longitude: 46.6753,
92+
});
93+
expect(result.months['1']).toBeDefined();
94+
});
95+
96+
it('should fetch prayer times with all Aladhan parameters', async () => {
97+
jest.spyOn(httpService, 'get').mockReturnValue(of(mockAxiosResponse));
98+
99+
const params = {
100+
method: 3,
101+
school: 1,
102+
midnightMode: 0,
103+
shafaq: 'general',
104+
latitudeAdjustment: 1,
105+
tune: '0,5,0,0,0,0,0,-2,0',
106+
year: 2025,
107+
month: 1,
108+
};
109+
110+
await service.getPrayerTimes(24.7136, 46.6753, params);
111+
112+
expect(httpService.get).toHaveBeenCalledWith(
113+
'https://api.aladhan.com/v1/calendar',
114+
{
115+
params: {
116+
latitude: 24.7136,
117+
longitude: 46.6753,
118+
iso8601: true,
119+
annual: true,
120+
method: 3,
121+
school: 1,
122+
midnightMode: 0,
123+
shafaq: 'general',
124+
latitudeAdjustment: 1,
125+
tune: '0,5,0,0,0,0,0,-2,0',
126+
year: 2025,
127+
month: 1,
128+
},
129+
},
130+
);
131+
});
132+
133+
it('should fetch prayer times with no optional parameters', async () => {
134+
jest.spyOn(httpService, 'get').mockReturnValue(of(mockAxiosResponse));
135+
136+
await service.getPrayerTimes(24.7136, 46.6753);
137+
138+
expect(httpService.get).toHaveBeenCalledWith(
139+
'https://api.aladhan.com/v1/calendar',
140+
{
141+
params: {
142+
latitude: 24.7136,
143+
longitude: 46.6753,
144+
iso8601: true,
145+
annual: true,
146+
},
147+
},
148+
);
149+
});
150+
});
20151
});

src/prayer-times/services/prayer-times.service.spec.ts

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,17 @@ import { ProviderService } from '@/prayer-times/services/provider/provider.servi
55

66
describe('PrayerTimesService', () => {
77
let service: PrayerTimesService;
8+
let providerService: ProviderService;
9+
let providerRegistry: ProviderRegistryService;
10+
11+
const mockProvider = {
12+
id: 1,
13+
name: 'Aladhan',
14+
website: 'https://aladhan.com',
15+
};
16+
const mockProviderService = {
17+
getPrayerTimes: jest.fn(),
18+
};
819

920
beforeEach(async () => {
1021
const module: TestingModule = await Test.createTestingModule({
@@ -13,23 +24,68 @@ describe('PrayerTimesService', () => {
1324
{
1425
provide: ProviderService,
1526
useValue: {
16-
getProviderById: jest.fn(),
17-
getProviders: jest.fn(),
27+
getProviderById: jest.fn().mockReturnValue(mockProvider),
28+
getProviders: jest.fn().mockReturnValue([mockProvider]),
1829
},
1930
},
2031
{
2132
provide: ProviderRegistryService,
2233
useValue: {
23-
getProviderService: jest.fn(),
34+
getProviderService: jest.fn().mockReturnValue(mockProviderService),
2435
},
2536
},
2637
],
2738
}).compile();
2839

2940
service = module.get<PrayerTimesService>(PrayerTimesService);
41+
providerService = module.get<ProviderService>(ProviderService);
42+
providerRegistry = module.get<ProviderRegistryService>(
43+
ProviderRegistryService,
44+
);
3045
});
3146

3247
it('should be defined', () => {
3348
expect(service).toBeDefined();
3449
});
50+
51+
describe('getPrayerTimes', () => {
52+
it('should call provider service with correct parameters', async () => {
53+
const mockResponse = {
54+
timezone: 'Asia/Riyadh',
55+
location: { latitude: 24.7136, longitude: 46.6753 },
56+
months: {},
57+
};
58+
59+
mockProviderService.getPrayerTimes.mockResolvedValue(mockResponse);
60+
61+
const result = await service.getPrayerTimes(24.7136, 46.6753, 1, {
62+
method: 3,
63+
school: 1,
64+
});
65+
66+
expect(result).toEqual(mockResponse);
67+
expect(providerRegistry.getProviderService).toHaveBeenCalledWith(1);
68+
expect(mockProviderService.getPrayerTimes).toHaveBeenCalledWith(
69+
24.7136,
70+
46.6753,
71+
{ method: 3, school: 1 },
72+
);
73+
});
74+
75+
it('should use default provider when none specified', async () => {
76+
const mockResponse = {
77+
timezone: 'Asia/Riyadh',
78+
location: { latitude: 24.7136, longitude: 46.6753 },
79+
months: {},
80+
};
81+
82+
mockProviderService.getPrayerTimes.mockResolvedValue(mockResponse);
83+
(providerService.getProviderById as jest.Mock).mockReturnValue(null);
84+
85+
await service.getPrayerTimes(24.7136, 46.6753, undefined, { method: 3 });
86+
87+
expect(providerService.getProviders).toHaveBeenCalled();
88+
expect(providerRegistry.getProviderService).toHaveBeenCalledWith(1);
89+
});
90+
});
3591
});

0 commit comments

Comments
 (0)