diff --git a/src/app/features/article/models/comment.model.ts b/src/app/features/article/models/comment.model.ts index 6a6350b5b..6621c22dd 100644 --- a/src/app/features/article/models/comment.model.ts +++ b/src/app/features/article/models/comment.model.ts @@ -4,5 +4,6 @@ export interface Comment { id: string; body: string; createdAt: string; + updatedAt: string; author: Profile; } diff --git a/src/app/features/article/services/articles.service.spec.ts b/src/app/features/article/services/articles.service.spec.ts index a6a8af9a6..d17580730 100644 --- a/src/app/features/article/services/articles.service.spec.ts +++ b/src/app/features/article/services/articles.service.spec.ts @@ -147,6 +147,30 @@ describe('ArticlesService', () => { const req = httpMock.expectOne('/articles'); req.flush({ articles: [], articlesCount: 0 }); }); + + it('should skip undefined filter values', () => { + const config: ArticleListConfig = { + type: 'all', + filters: { + tag: 'angular', + author: undefined, + limit: 10, + }, + }; + + service.query(config).subscribe(); + + const req = httpMock.expectOne(request => { + return ( + request.url === '/articles' && + request.params.get('tag') === 'angular' && + request.params.get('author') === null && + request.params.get('limit') === '10' + ); + }); + + req.flush({ articles: mockArticleList, articlesCount: 2 }); + }); }); describe('get', () => { @@ -255,12 +279,18 @@ describe('ArticlesService', () => { describe('unfavorite', () => { it('should unfavorite an article', async () => { const slug = 'article-to-unfavorite'; + const unfavoritedArticle = { + ...mockArticle, + favorited: false, + favoritesCount: 4, + }; const promise = firstValueFrom(service.unfavorite(slug)); const req = httpMock.expectOne(`/articles/${slug}/favorite`); expect(req.request.method).toBe('DELETE'); - req.flush(null); - await promise; - expect(true).toBe(true); + req.flush({ article: unfavoritedArticle }); + const article = await promise; + expect(article.favorited).toBe(false); + expect(article.favoritesCount).toBe(4); }); }); }); diff --git a/src/app/features/article/services/articles.service.ts b/src/app/features/article/services/articles.service.ts index c4b816b98..2c2418b01 100644 --- a/src/app/features/article/services/articles.service.ts +++ b/src/app/features/article/services/articles.service.ts @@ -14,8 +14,10 @@ export class ArticlesService { let params = new HttpParams(); Object.keys(config.filters).forEach(key => { - // @ts-ignore - params = params.set(key, config.filters[key]); + const value = config.filters[key as keyof typeof config.filters]; + if (value !== undefined) { + params = params.set(key, value.toString()); + } }); return this.http.get<{ articles: Article[]; articlesCount: number }>( @@ -48,7 +50,7 @@ export class ArticlesService { return this.http.post<{ article: Article }>(`/articles/${slug}/favorite`, {}).pipe(map(data => data.article)); } - unfavorite(slug: string): Observable { - return this.http.delete(`/articles/${slug}/favorite`); + unfavorite(slug: string): Observable
{ + return this.http.delete<{ article: Article }>(`/articles/${slug}/favorite`).pipe(map(data => data.article)); } }