Skip to content
Snippets Groups Projects
posts.controller.spec.ts 15.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • import { HttpModule, HttpService } from '@nestjs/axios';
    
    import { Test, TestingModule } from '@nestjs/testing';
    
    Hugo SUBTIL's avatar
    Hugo SUBTIL committed
    import { of } from 'rxjs';
    
    import { ConfigurationModule } from '../configuration/configuration.module';
    
    import { PostsController } from './posts.controller';
    
    import { PostsService } from './posts.service';
    
    Hugo SUBTIL's avatar
    Hugo SUBTIL committed
    import { AxiosResponse } from 'axios';
    
    
    describe('PostsController', () => {
      let controller: PostsController;
    
    
    Hugo SUBTIL's avatar
    Hugo SUBTIL committed
      const httpServiceMock = {
        get: jest.fn(),
      };
    
      const postServiceMock = {
        getLocationTags: jest.fn(),
        getPublicTags: jest.fn(),
        getRegularTags: jest.fn(),
        formatPosts: jest.fn(),
      };
    
    
      beforeEach(async () => {
        const module: TestingModule = await Test.createTestingModule({
    
          imports: [ConfigurationModule, HttpModule],
    
    Hugo SUBTIL's avatar
    Hugo SUBTIL committed
          providers: [
            {
              provide: PostsService,
              useValue: postServiceMock,
            },
            {
              provide: HttpService,
              useValue: httpServiceMock,
            },
          ],
    
          controllers: [PostsController],
        }).compile();
    
        controller = module.get<PostsController>(PostsController);
      });
    
      it('should be defined', () => {
        expect(controller).toBeDefined();
      });
    
    Hugo SUBTIL's avatar
    Hugo SUBTIL committed
      describe('findAll', () => {
        it('should get all posts', async () => {
          const query = '';
          const result: AxiosResponse = {
            data: {
              posts: [
                {
                  id: '61c4847b0ff4550001505090',
                  uuid: 'f4ee5a37-a343-4cad-8a32-3f6cf87f9569',
                  title: 'Only feature image',
                  slug: 'only-feature-image',
                  html: '<p>Test</p>',
                  comment_id: '61c4847b0ff4550001505090',
                  feature_image: 'http://localhost:2368/content/images/2021/12/dacc-4.png',
                  featured: false,
                  visibility: 'public',
                  email_recipient_filter: 'none',
                  created_at: '2021-12-23T14:15:23.000+00:00',
                  updated_at: '2021-12-23T14:15:45.000+00:00',
                  published_at: '2021-12-23T14:15:45.000+00:00',
                  custom_excerpt: null,
                  codeinjection_head: null,
                  codeinjection_foot: null,
                  custom_template: null,
                  canonical_url: null,
                  tags: [Array],
                  authors: [Array],
                  primary_author: [Object],
                  primary_tag: [Object],
                  url: 'http://localhost:2368/only-feature-image/',
                  excerpt:
                    '« Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus.\n' +
                    'Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed,\n' +
                    'dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper\n' +
                    'congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est\n' +
                    'eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu\n' +
                    'massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut\n' +
                    'in risus volutpat libero pharetra tem',
                  reading_time: 2,
                  access: true,
                  send_email_when_published: false,
                  og_image: null,
                  og_title: null,
                  og_description: null,
                  twitter_image: null,
                  twitter_title: null,
                  twitter_description: null,
                  meta_title: null,
                  meta_description: null,
                  email_subject: null,
                  frontmatter: null,
                },
                {
                  id: '61c4847b0ff4550001505090',
                  uuid: 'f4ee5a37-a343-4cad-8a32-3f6cf87f9569',
                  title: 'Only test image',
                  slug: 'only-test-image',
                  html: '<p>Test 2</p>',
                  comment_id: '61c4847b0ff4550001505090',
                  feature_image: 'http://localhost:2368/content/images/2021/12/test.png',
                  featured: false,
                  visibility: 'public',
                  email_recipient_filter: 'none',
                  created_at: '2021-12-23T14:15:23.000+00:00',
                  updated_at: '2021-12-23T14:15:45.000+00:00',
                  published_at: '2021-12-23T14:15:45.000+00:00',
                  custom_excerpt: null,
                  codeinjection_head: null,
                  codeinjection_foot: null,
                  custom_template: null,
                  canonical_url: null,
                  tags: [Array],
                  authors: [Array],
                  primary_author: [Object],
                  primary_tag: [Object],
                  url: 'http://localhost:2368/only-feature-image/',
                  excerpt:
                    '« Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus.\n' +
                    'Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed,\n' +
                    'dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper\n' +
                    'congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est\n' +
                    'eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu\n' +
                    'massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut\n' +
                    'in risus volutpat libero pharetra tem',
                  reading_time: 2,
                  access: true,
                  send_email_when_published: false,
                  og_image: null,
                  og_title: null,
                  og_description: null,
                  twitter_image: null,
                  twitter_title: null,
                  twitter_description: null,
                  meta_title: null,
                  meta_description: null,
                  email_subject: null,
                  frontmatter: null,
                },
                {
                  id: '61c4847b0ff4550001505090',
                  uuid: 'f4ee5a37-a343-4cad-8a32-3f6cf87f9569',
                  title: 'Only toto image',
                  slug: 'only-toto-image',
                  html: '<p>Test 3</p>',
                  comment_id: '61c4847b0ff4550001505090',
                  feature_image: 'http://localhost:2368/content/images/2021/12/dacc-4.png',
                  featured: false,
                  visibility: 'public',
                  email_recipient_filter: 'none',
                  created_at: '2021-12-23T14:15:23.000+00:00',
                  updated_at: '2021-12-23T14:15:45.000+00:00',
                  published_at: '2021-12-23T14:15:45.000+00:00',
                  custom_excerpt: null,
                  codeinjection_head: null,
                  codeinjection_foot: null,
                  custom_template: null,
                  canonical_url: null,
                  tags: [Array],
                  authors: [Array],
                  primary_author: [Object],
                  primary_tag: [Object],
                  url: 'http://localhost:2368/only-feature-image/',
                  excerpt:
                    '« Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus.\n' +
                    'Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed,\n' +
                    'dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper\n' +
                    'congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est\n' +
                    'eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu\n' +
                    'massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut\n' +
                    'in risus volutpat libero pharetra tem',
                  reading_time: 2,
                  access: true,
                  send_email_when_published: false,
                  og_image: null,
                  og_title: null,
                  og_description: null,
                  twitter_image: null,
                  twitter_title: null,
                  twitter_description: null,
                  meta_title: null,
                  meta_description: null,
                  email_subject: null,
                  frontmatter: null,
                },
              ],
              meta: { pagination: { page: 1, limit: 15, pages: 1, total: 2, next: null, prev: null } },
            },
            status: 200,
            statusText: 'OK',
            headers: {},
            config: {},
          };
          jest.spyOn(httpServiceMock, 'get').mockImplementationOnce(() => of(result));
          const response = await controller.findAll(query);
          expect(response.posts.length).toEqual(3);
          expect(response.meta.pagination.limit).toEqual(15);
          expect(response.meta.pagination.page).toEqual(1);
          expect(response.meta.pagination.total).toEqual(2);
        });
    
    Hugo SUBTIL's avatar
    Hugo SUBTIL committed
      describe('findAllTags', () => {
        it('should get all tags', async () => {
          postServiceMock.getLocationTags.mockImplementationOnce(() => [
            {
              id: '61b74b2c0d3b9800018ca3df',
              name: 'oullins',
              slug: 'oullins',
              description: 'commune',
              feature_image: null,
              visibility: 'public',
              og_image: null,
              og_title: null,
              og_description: null,
              twitter_image: null,
              twitter_title: null,
              twitter_description: null,
              meta_title: null,
              meta_description: null,
              codeinjection_head: null,
              codeinjection_foot: null,
              canonical_url: null,
              accent_color: null,
              created_at: '2021-12-13T13:31:24.000Z',
              updated_at: '2021-12-13T13:31:25.000Z',
              url: 'http://localhost:2368/tag/oullins/',
            },
            {
              id: '61b74b2c0d3b9800018ca3df',
              name: 'oullins',
              slug: 'oullins',
              description: 'commune',
              feature_image: null,
              visibility: 'public',
              og_image: null,
              og_title: null,
              og_description: null,
              twitter_image: null,
              twitter_title: null,
              twitter_description: null,
              meta_title: null,
              meta_description: null,
              codeinjection_head: null,
              codeinjection_foot: null,
              canonical_url: null,
              accent_color: null,
              created_at: '2021-12-13T13:31:24.000Z',
              updated_at: '2021-12-13T13:31:25.000Z',
              url: 'http://localhost:2368/tag/oullins/',
            },
            {
              id: '61b74b2c0d3b9800018ca3e0',
              name: 'Bron',
              slug: 'bron',
              description: 'commune',
              feature_image: null,
              visibility: 'public',
              og_image: null,
              og_title: null,
              og_description: null,
              twitter_image: null,
              twitter_title: null,
              twitter_description: null,
              meta_title: null,
              meta_description: null,
              codeinjection_head: null,
              codeinjection_foot: null,
              canonical_url: null,
              accent_color: null,
              created_at: '2021-12-13T13:31:24.000Z',
              updated_at: '2021-12-13T13:31:24.000Z',
              url: 'http://localhost:2368/404/',
            },
          ]);
          postServiceMock.getPublicTags.mockImplementationOnce(() => [
            {
              id: '61b74b2d0d3b9800018ca3f6',
              name: 'Séniors (+ de 65ans)',
              slug: 'seniors-de-65ans',
              description: 'public',
              feature_image: null,
              visibility: 'public',
              og_image: null,
              og_title: null,
              og_description: null,
              twitter_image: null,
              twitter_title: null,
              twitter_description: null,
              meta_title: null,
              meta_description: null,
              codeinjection_head: null,
              codeinjection_foot: null,
              canonical_url: null,
              accent_color: null,
              created_at: '2021-12-13T13:31:25.000Z',
              updated_at: '2021-12-13T13:31:25.000Z',
              url: 'http://localhost:2368/404/',
            },
            {
              id: '61b74b2d0d3b9800018ca3f7',
              name: 'Allophones',
              slug: 'allophones',
              description: 'public',
              feature_image: null,
              visibility: 'public',
              og_image: null,
              og_title: null,
              og_description: null,
              twitter_image: null,
              twitter_title: null,
              twitter_description: null,
              meta_title: null,
              meta_description: null,
              codeinjection_head: null,
              codeinjection_foot: null,
              canonical_url: null,
              accent_color: null,
              created_at: '2021-12-13T13:31:25.000Z',
              updated_at: '2021-12-13T13:31:25.000Z',
              url: 'http://localhost:2368/404/',
            },
          ]);
          postServiceMock.getRegularTags.mockImplementationOnce(() => [
            {
              id: '61b74b2d0d3b9800018ca3fa',
              name: 'Études',
              slug: 'etudes',
              description: null,
              feature_image: null,
              visibility: 'public',
              og_image: null,
              og_title: null,
              og_description: null,
              twitter_image: null,
              twitter_title: null,
              twitter_description: null,
              meta_title: null,
              meta_description: null,
              codeinjection_head: null,
              codeinjection_foot: null,
              canonical_url: null,
              accent_color: null,
              created_at: '2021-12-13T13:31:25.000Z',
              updated_at: '2021-12-13T13:31:25.000Z',
              url: 'http://localhost:2368/tag/etudes/',
            },
          ]);
          const result = await controller.findAllTags();
          expect(result.commune.length).toBe(3);
          expect(result.others.length).toBe(1);
          expect(result.public.length).toBe(2);
        });
    
    Hugo SUBTIL's avatar
    Hugo SUBTIL committed
      describe('getPostbyId', () => {
        it('should get post Hello by id 61c4847b0ff4550001505090', async () => {
          const data = [
            {
              id: '61c4847b0ff4550001505090',
              uuid: 'f4ee5a37-a343-4cad-8a32-3f6cf87f9569',
              title: 'Hello',
              slug: 'hello',
              html: '<p>Test</p>',
              comment_id: '61c4847b0ff4550001505090',
              feature_image: 'http://localhost:2368/content/images/2021/12/dacc-4.png',
              featured: false,
              visibility: 'public',
              email_recipient_filter: 'none',
              created_at: '2021-12-23T14:15:23.000+00:00',
              updated_at: '2021-12-23T14:15:45.000+00:00',
              published_at: '2021-12-23T14:15:45.000+00:00',
              custom_excerpt: null,
              codeinjection_head: null,
              codeinjection_foot: null,
              custom_template: null,
              canonical_url: null,
              tags: [Array],
              authors: [Array],
              primary_author: [Object],
              primary_tag: [Object],
              url: 'http://localhost:2368/hello/',
              excerpt:
                '« Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus.\n' +
                'Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed,\n' +
                'dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper\n' +
                'congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est\n' +
                'eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu\n' +
                'massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut\n' +
                'in risus volutpat libero pharetra tem',
              reading_time: 2,
              access: true,
              send_email_when_published: false,
              og_image: null,
              og_title: null,
              og_description: null,
              twitter_image: null,
              twitter_title: null,
              twitter_description: null,
              meta_title: null,
              meta_description: null,
              email_subject: null,
              frontmatter: null,
            },
          ];
          const axiosResult: AxiosResponse = {
            data: {
              posts: data,
            },
            status: 200,
            statusText: 'OK',
            headers: {},
            config: {},
          };
          httpServiceMock.get.mockImplementationOnce(() => of(axiosResult));
          postServiceMock.formatPosts.mockImplementationOnce(() => data);
          const result = await (await controller.getPostbyId('61c4847b0ff4550001505090')).toPromise();
          expect(result).toStrictEqual({ posts: [data] });
        });