Skip to content

Commit

Permalink
Merge branch 'dev'
Browse files Browse the repository at this point in the history
  • Loading branch information
the-sabra committed Aug 6, 2024
2 parents e9f7cdf + cc53e53 commit fdf583b
Showing 8 changed files with 1,143 additions and 1 deletion.
102 changes: 102 additions & 0 deletions src/audio/audio.controller.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import { Test, TestingModule } from '@nestjs/testing';
import { AudioController } from './audio.controller';
import { AudioService } from './audio.service';
import { CreateAudioDto } from './dto/create-audio.dto';
import { FilterAudioDto } from './dto/filter-audio.dto';
import { TilawaSurah } from 'src/surah/entities/tilawa-surah.entity';

describe('AudioController', () => {
let controller: AudioController;
let service: AudioService;

beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [AudioController],
providers: [
{
provide: AudioService,
useValue: {
create: jest.fn(),
getAudio: jest.fn(),
},
},
],
}).compile();

controller = module.get<AudioController>(AudioController);
service = module.get<AudioService>(AudioService);
});

it('should be defined', () => {
expect(controller).toBeDefined();
});

describe('create', () => {
it('should create a new audio', async () => {
const createAudioDto: CreateAudioDto = {
surah_id: 1,
tilawa_id: 1,
url: 'https://example.com/audio.mp3',
};
const expectedResult: Partial<TilawaSurah> & { reciter_id: number } = {
surah_id: 1,
tilawa_id: 1,
url: 'https://example.com/audio.mp3',
tilawa: {
id: 1,
name: 'Test Tilawa',
name_english: 'Test Tilawa',
reciter_id: 1,
reciter: {},
tilawaSurah: [],
} as any,
surah: {} as any,
reciter_id: 1,
};

jest.spyOn(service, 'create').mockResolvedValue({
...expectedResult,
reciter_id: 1,
} as TilawaSurah & { reciter_id: number });

const result = await controller.create(createAudioDto);

expect(result).toEqual(expectedResult);
expect(service.create).toHaveBeenCalledWith(createAudioDto);
});
});

describe('get', () => {
it('should get audio by filter', async () => {
const filterAudioDto: FilterAudioDto = {
surah_id: 1,
reciter_id: 1,
};
const expectedResult: Partial<TilawaSurah> & { reciter_id: number } = {
surah_id: 1,
tilawa_id: 1,
url: 'https://example.com/audio.mp3',
tilawa: {
id: 1,
name: 'Test Tilawa',
name_english: 'Test Tilawa',
reciter_id: 1,
reciter: {},
tilawaSurah: [],
} as any,
surah: {} as any,
reciter_id: 1,
};

jest.spyOn(service, 'getAudio').mockResolvedValue({
...expectedResult,
reciter_id: 1,
} as TilawaSurah & { reciter_id: number });

const result = await controller.get(filterAudioDto);

expect(result).toEqual(expectedResult);
expect(service.getAudio).toHaveBeenCalledWith(filterAudioDto);
});
});
});
149 changes: 149 additions & 0 deletions src/audio/audio.service.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
import { Test, TestingModule } from '@nestjs/testing';
import { getRepositoryToken } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { AudioService } from './audio.service';
import { TilawaSurah } from 'src/surah/entities/tilawa-surah.entity';
import { CreateAudioDto } from './dto/create-audio.dto';
import { FilterAudioDto } from './dto/filter-audio.dto';
import { NotFoundException } from '@nestjs/common';
import { ReciterService } from 'src/reciter/reciter.service';

describe('AudioService', () => {
let service: AudioService;
let tilawaSurahRepo: Repository<TilawaSurah>;
let reciterService: ReciterService;

beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
AudioService,
{
provide: getRepositoryToken(TilawaSurah),
useClass: Repository,
},
{
provide: ReciterService,
useValue: {
getReciterTilawa: jest.fn(),
},
},
],
}).compile();

service = module.get<AudioService>(AudioService);
tilawaSurahRepo = module.get<Repository<TilawaSurah>>(
getRepositoryToken(TilawaSurah),
);
reciterService = module.get<ReciterService>(ReciterService);
});

it('should be defined', () => {
expect(service).toBeDefined();
});

describe('create', () => {
it('should create a new audio', async () => {
const createAudioDto: CreateAudioDto = {
surah_id: 1,
tilawa_id: 1,
url: 'https://example.com/audio.mp3',
};
const expectedResult: Partial<TilawaSurah> = {
surah_id: 1,
tilawa_id: 1,
url: 'https://example.com/audio.mp3',
tilawa: {
id: 1,
name: 'Test Tilawa',
name_english: 'Test Tilawa',
reciter_id: 1,
reciter: {},
tilawaSurah: [],
} as any,
surah: {} as any,
};

jest
.spyOn(tilawaSurahRepo, 'create')
.mockReturnValue(expectedResult as TilawaSurah);
jest
.spyOn(tilawaSurahRepo, 'save')
.mockResolvedValue(expectedResult as TilawaSurah);

const result = await service.create(createAudioDto);

expect(result).toEqual(expectedResult);
expect(tilawaSurahRepo.create).toHaveBeenCalledWith(createAudioDto);
expect(tilawaSurahRepo.save).toHaveBeenCalledWith(expectedResult);
});
});

describe('getAudio', () => {
it('should get audio by filter', async () => {
const filterAudioDto: FilterAudioDto = {
surah_id: 1,
reciter_id: 1,
};
const expectedResult: Partial<TilawaSurah> & { reciter_id: number } = {
surah_id: 1,
tilawa_id: 1,
url: 'https://example.com/audio.mp3',
tilawa: {
id: 1,
name: 'Test Tilawa',
name_english: 'Test Tilawa',
reciter_id: 1,
reciter: {},
tilawaSurah: [],
} as any,
surah: {} as any,
reciter_id: 1,
};

jest.spyOn(reciterService, 'getReciterTilawa').mockResolvedValue([
{
id: 1,
name: 'حفص عن عاصم - مرتل',
name_english: 'Hafs an Asim - Murattal',
reciter_id: 1,
reciter: {} as any,
tilawaSurah: [] as any[],
},
]);
jest
.spyOn(tilawaSurahRepo, 'findOne')
.mockResolvedValue(expectedResult as TilawaSurah);

const result = await service.getAudio(filterAudioDto);

expect(result).toEqual(expectedResult);
expect(tilawaSurahRepo.findOne).toHaveBeenCalledWith({
where: { surah_id: filterAudioDto.surah_id, tilawa_id: 1 },
});
});

it('should throw NotFoundException when audio is not found', async () => {
const filterAudioDto: FilterAudioDto = {
surah_id: 1,
reciter_id: 1,
};

jest.spyOn(reciterService, 'getReciterTilawa').mockResolvedValue([
{
id: 1,
name: 'حفص عن عاصم - مرتل',
name_english: 'Hafs an Asim - Murattal',
reciter_id: 1,
reciter: {} as any,
tilawaSurah: [] as any[],
},
]);

jest.spyOn(tilawaSurahRepo, 'findOne').mockResolvedValue(null);

await expect(service.getAudio(filterAudioDto)).rejects.toThrow(
NotFoundException,
);
});
});
});
4 changes: 3 additions & 1 deletion src/audio/audio.service.ts
Original file line number Diff line number Diff line change
@@ -21,7 +21,9 @@ export class AudioService {
return this.tilawaSurahRepo.save(audio);
}

async getAudio(paginatedFilter: FilterAudioDto) {
async getAudio(
paginatedFilter: FilterAudioDto,
): Promise<TilawaSurah & { reciter_id: number }> {
const { surah_id, reciter_id } = paginatedFilter;
let tilawa_id = paginatedFilter.tilawa_id;

109 changes: 109 additions & 0 deletions src/reciter/reciter.controller.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
import { Test, TestingModule } from '@nestjs/testing';
import { ReciterController } from './reciter.controller';
import { ReciterService } from './reciter.service';
import { CreateReciterDto } from './dto/create-reciter.dto';
import { AddImageDto } from './dto/add-image.dto';
import { Reciter } from './entities/reciter.entity';

describe('ReciterController', () => {
let controller: ReciterController;
let service: ReciterService;

beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [ReciterController],
providers: [
{
provide: ReciterService,
useValue: {
create: jest.fn(),
findAll: jest.fn(),
findOne: jest.fn(),
updateReciterImage: jest.fn(),
},
},
],
}).compile();

controller = module.get<ReciterController>(ReciterController);
service = module.get<ReciterService>(ReciterService);
});

it('should be defined', () => {
expect(controller).toBeDefined();
});

describe('create', () => {
it('should create a reciter', async () => {
const createReciterDto: CreateReciterDto = {
id: 1,
name_english: 'John Doe',
name_arabic: 'جون دو',
image: 'http://example.com/image.jpg',
};
const expectedResult = { id: 1, ...createReciterDto };

jest
.spyOn(service, 'create')
.mockResolvedValue(expectedResult as Reciter);

expect(await controller.create(createReciterDto)).toBe(expectedResult);
expect(service.create).toHaveBeenCalledWith(createReciterDto);
});
});

describe('findAll', () => {
it('should return all reciters', async () => {
const expectedResult = [
{ id: 1, name_english: 'John Doe', name_arabic: 'جون دو' },
];
jest
.spyOn(service, 'findAll')
.mockResolvedValue(expectedResult as Reciter[]);

expect(await controller.findAll('eng')).toBe(expectedResult);
expect(service.findAll).toHaveBeenCalledWith('eng');
});
});

describe('findOne', () => {
it('should return a single reciter', async () => {
const expectedResult = {
id: 1,
name_english: 'John Doe',
name_arabic: 'جون دو',
};
jest
.spyOn(service, 'findOne')
.mockResolvedValue(expectedResult as Reciter);

expect(await controller.findOne('1')).toBe(expectedResult);
expect(service.findOne).toHaveBeenCalledWith(1);
});
});

describe('addSurahImage', () => {
it('should update reciter image', async () => {
const addImageDto: AddImageDto = {
image: 'http://example.com/new-image.jpg',
};
const expectedResult = {
id: 1,
name_english: 'John Doe',
name_arabic: 'جون دو',
image: addImageDto.image,
};
jest
.spyOn(service, 'updateReciterImage')
.mockResolvedValue(expectedResult as Reciter);

expect(await controller.addSurahImage(1, addImageDto)).toBe(
expectedResult,
);
expect(service.updateReciterImage).toHaveBeenCalledWith(
1,
addImageDto.image,
);
});
});
});
Loading

0 comments on commit fdf583b

Please sign in to comment.