<reponame>joalcapa/TestRNJest<gh_stars>0
import React from 'react';

import Contacts from '../src/Contacts';

const expect = global.expect;

describe('contacts', () => {
    const variousContacts = [
        {
            nombre: 'Jhon',
            email: '<EMAIL>',
            id: 1
        },
        {
            nombre: 'JhonTorres',
            email: '<EMAIL>',
            id: 2
        },
        {
            nombre: 'JhonGames',
            email: '<EMAIL>',
            id: 3
        },
    ];
    const urlStarWars = 'http://swapi.co/api/people';

    describe('incluir', () => {
       beforeEach(() => {
           Contacts.reset();
       });

       test('Debe agregar un contacto con props {name, email, id}', () => {
          const contacto = variousContacts[0];
          Contacts.add(contacto);

          const currentContact = Contacts.db();
          const validContact = [contacto];

          expect(currentContact).toEqual(validContact);
       });

       test('Debe mostrar un error si no contiene los props {name, email, id}', () => {
          const contact = {
              nombre: 'Steven',
              email: '<EMAIL>'
          };

          expect(() => Contacts.add(contact)).toThrow('invalid format');
       });


    });

    describe('delete', () => {
        beforeEach(() => {
            Contacts.reset();
            variousContacts.forEach( contacto => Contacts.add(contacto));
        });

        test('Debe borrar solo el primer contacto', () => {
            Contacts.delete(1);

            const currentContact = Contacts.db();
            const validateContact = [
                variousContacts[1],
                variousContacts[2]
            ];

            expect(currentContact).toEqual(validateContact);
        });

        test('No debe borrar ningun contacto si el id no se encontro', () => {
            Contacts.delete(100);
            const currentContact = Contacts.db();
            const validateContact = variousContacts;

            expect(currentContact).toEqual(validateContact);
        });
    });

    describe('starwars', () => {

        test('Debe contener personajes de Star Wars', (done) => {
           Contacts.fetchStarWars(urlStarWars)
               .then( count => {
                   expect(count).toBeGreaterThan(0); // contador mayor que cero
                   done(); // de esta manera se le dice a jest que se termino de realizar el test, entonces jest verifica si el test es correcto o no
               });
        });

        test('Debe fallar si la url es incorrecta', async () => {
            const url = 'http://swapi.co/api/yolo';

            const currentContact = Contacts.fetchStarWars(url);
            await expect(currentContact).rejects.toEqual(Error('Request failed with status code 404'));
        });
    });
});