Skip to content

Commit

Permalink
Add tests for reactive form
Browse files Browse the repository at this point in the history
  • Loading branch information
fdodino committed Jun 12, 2024
1 parent e3a18c4 commit aad3e5d
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 16 deletions.
14 changes: 13 additions & 1 deletion src/app/apuestas-binding/apuestas-binding.component.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'

import { ApuestasBindingComponent } from './apuestas-binding.component'
import { getByTestId, mensajeDeError, resultado } from '../../utils/test-utils'
import { Apuesta, DOCENA, PLENO, TipoApuesta } from '../domain/apuesta'
import dayjs from 'dayjs'

Expand Down Expand Up @@ -100,4 +99,17 @@ function apostarAl(tipoApuesta: TipoApuesta, numero: number | string, monto = 20

const apostarHoy = (component: ApuestasBindingComponent) => {
component.fechaApuesta = dayjs(new Date()).format('DD/MM/YYYY')
}

export const getByTestId = (appComponent: ComponentFixture<unknown>, testId: string) => {
const compiled = appComponent.debugElement.nativeElement
return compiled.querySelector(`[data-testid="${testId}"]`)
}

export const mensajeDeError = (fixture: ComponentFixture<unknown>, field: string) => {
return getByTestId(fixture, `errorMessage-${field}`).textContent
}

export const resultado = (fixture: ComponentFixture<unknown>) => {
return getByTestId(fixture, 'resultado').textContent
}
78 changes: 78 additions & 0 deletions src/app/apuestas-reactive/apuestas-reactive.component.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'

import dayjs from 'dayjs'
import { Apuesta } from '../domain/apuesta'
import { ApuestasReactiveComponent } from './apuestas-reactive.component'

describe('ApuestasReactiveComponent', () => {
Expand All @@ -19,4 +21,80 @@ describe('ApuestasReactiveComponent', () => {
it('should create', () => {
expect(component).toBeTruthy()
})
it('should fail if no date is entered', () => {
getByTestId(fixture, 'btnApuesta').click()
fixture.detectChanges()
expect(mensajeDeError(fixture, 'fecha')).toContain('Debe ingresar fecha')
})
it('should fail if previous date is entered', () => {
apostarElDia(component, '01/01/1900')
component.apuesta = new Apuesta()
getByTestId(fixture, 'btnApuesta').click()
fixture.detectChanges()
expect(mensajeDeError(fixture, 'fecha')).toContain('Debe ingresar fecha de hoy o futura')
})
it('should fail if negative amount is entered', () => {
apostarHoy(component)
component.apuesta = Object.assign(
new Apuesta(),
{
fecha: new Date(),
monto: -10,
}
)
getByTestId(fixture, 'btnApuesta').click()
fixture.detectChanges()
expect(mensajeDeError(fixture, 'monto')).toContain('Debe ingresar un valor mayor para monto')
})
it('should pass all validations and inform if user wins - single', () => {
apostarHoy(component)
apostarAl(component, 25)

const hacerGanarSpy = spyOn(component.apuesta, 'obtenerNumeroGanador').and.returnValue(25)
// se podría hacer a mano pero hay que deshacer esto al final del test
// o produciría efecto colateral => el número ganador sería siempre 24
// component.apuesta.obtenerNumeroGanador = () => 25
getByTestId(fixture, 'btnApuesta').click()
fixture.detectChanges()
hacerGanarSpy.calls.reset()

expect(resultado(fixture)).toContain('Ganaste $700')
})
it('should pass all validations and inform if user loses - single', () => {
apostarHoy(component)
apostarAl(component, 25)
const hacerPerderSpy = spyOn(component.apuesta, 'obtenerNumeroGanador').and.returnValue(24)
getByTestId(fixture, 'btnApuesta').click()
fixture.detectChanges()
hacerPerderSpy.calls.reset()

expect(resultado(fixture)).toContain('¡¡Perdiste!! Salió el 24')
})

})

const apostarAl = (component: ApuestasReactiveComponent, numero: number, monto = 20) => {
component.apuestaForm.get('monto')?.setValue(monto.toString())
component.apuestaForm.get('valorApostado')?.setValue(numero)
}

const apostarHoy = (component: ApuestasReactiveComponent) => {
apostarElDia(component, dayjs(new Date()).format('DD/MM/YYYY'))
}

const apostarElDia = (component: ApuestasReactiveComponent, fecha: string) => {
component.apuestaForm.get('fecha')?.setValue(fecha)
}

export const getByTestId = (appComponent: ComponentFixture<ApuestasReactiveComponent>, testId: string) => {
const compiled = appComponent.debugElement.nativeElement
return compiled.querySelector(`[data-testid="${testId}"]`)
}

export const mensajeDeError = (fixture: ComponentFixture<ApuestasReactiveComponent>, field: string) => {
return getByTestId(fixture, `errorMessage-${field}`).textContent
}

export const resultado = (fixture: ComponentFixture<ApuestasReactiveComponent>) => {
return getByTestId(fixture, 'resultado').textContent
}
3 changes: 2 additions & 1 deletion src/app/apuestas-reactive/apuestas-reactive.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export class ApuestasReactiveComponent {
Validators.min(MONTO_MINIMO_PLENO),
]
],
valorApostado: ['',
valorApostado: [1,
[
Validators.required,
]
Expand Down Expand Up @@ -55,6 +55,7 @@ export class ApuestasReactiveComponent {
{ fecha: fecha ? dayjs(fecha).toDate() : undefined },
)
this.apuesta.apostar()
console.info(this.apuesta.resultado?.valor())

// sin el binding necesitamos hacer las transformaciones a mano
this.apuestaForm.get('resultado')!.setValue(this.apuesta.resultado?.valor() ?? null)
Expand Down
1 change: 1 addition & 0 deletions src/app/domain/apuesta.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ export class Apuesta {
this.validarApuesta()
if (this.errors.length > 0) return
const numeroGanador = this.obtenerNumeroGanador()
console.info('salió el ', numeroGanador, this.valorApostado)
const ganancia = this.calcularGanancia(numeroGanador)
this.resultado = new Resultado(numeroGanador, ganancia)
}
Expand Down
14 changes: 0 additions & 14 deletions src/utils/test-utils.ts

This file was deleted.

0 comments on commit aad3e5d

Please sign in to comment.