Skip to content

Instantly share code, notes, and snippets.

View FunnyGhost's full-sized avatar
💭
💻 🐵

Catalin Ciubotaru FunnyGhost

💭
💻 🐵
View GitHub Profile
const favoriteUrl = 'test.favorite.com';
export const environment = {
production: false,
favoriteUrl
};
describe('FavoriteMoviesService', () => {
let serviceUnderTest: FavoriteMoviesService;
let http: HttpTestingController;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [FavoriteMoviesService]
});
export class FavoriteMoviesService {
constructor(private http: HttpClient) {}
getFavoriteMovies(): Observable<Movie[]> {
return this.http.get<Movie[]>(environment.favoriteUrl);
}
}
it('should throw if the backend returns an error ', () => {
let bubblesUpTheError = false;
serviceUnderTest.getFavoriteMovies().subscribe(() => {}, () => (bubblesUpTheError = true));
const req = http.expectOne(environment.favoriteUrl, 'expected to make a request');
expect(req.request.method).toEqual('GET');
req.flush('ERROR', { status: 500, statusText: 'Internal server error' });
expect(bubblesUpTheError).toBeTruthy();
http.verify();
it('should fail if the backend returns an error 3 times in a row', done => {
let bubblesUpTheError = false;
serviceUnderTest.getFavoriteMovies().subscribe(() => {}, () => (bubblesUpTheError = true);
const req = http.expectOne(environment.favoriteUrl, 'expected to make an initial request');
expect(req.request.method).toEqual('GET');
req.flush('ERROR', { status: 500, statusText: 'Internal server error' });
const req2 = http.expectOne(environment.favoriteUrl, 'expected to make a second request');
expect(req2.request.method).toEqual('GET');
getFavoriteMovies(): Observable<Movie[]> {
return this.http.get<Movie[]>(environment.favoriteUrl).pipe(retry(2));
}
it('should return the list of favorite movies if the backend returns an error 2 times and the succeds', () => {
let favoriteMovies: Movie[] = [];
serviceUnderTest.getFavoriteMovies().subscribe(data => {
favoriteMovies = data;
});
const req = http.expectOne(environment.favoriteUrl, 'expected to make an initial request');
expect(req.request.method).toEqual('GET');
req.flush('ERROR', { status: 500, statusText: 'Internal server error' });
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { retry } from 'rxjs/operators';
import { environment } from 'src/environments/environment';
import { Movie } from '../movie-list/core/models/movie';
@Injectable()
export class FavoriteMoviesService {
constructor(private http: HttpClient) {}
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { TestBed } from '@angular/core/testing';
import { environment } from 'src/environments/environment';
import { Movie } from '../movie-list/core/models/movie';
import { FavoriteMoviesService } from './favorite-movies.service';
const moviesToUse = [
{ title: 'Interstellar' } as Movie,
{ title: 'The Green Book' } as Movie,
{ title: 'Dark Knight' } as Movie
@Component({
selector: "kpd-favorite-movie",
templateUrl: "./favorite-movie.component.html",
styleUrls: ["./favorite-movie.component.scss"],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class FavoriteMovieComponent {
@Input() favoriteMovie: Movie;
@Output() deleteMovie = new EventEmitter<Movie>();