Jonathan Fontes

Solução TTD Parte 2 - Pitly

13 de December de 2017

Boa noite, vamos lá ao nosso segundo desafio de TDD. :)

pitly
O primeiro teste que fiz foi criar um teste para verificar quando for feito um redirect, criava um registo na tabela das estatisticas.

	/** @test */
    public function track_every_hit ()
    {
        $this->withoutExceptionHandling();
        $shorten = factory(Shorten::class)->create();
        $this->get("s/{$shorten->token}");

        $this->assertDatabaseHas('stats', [
            'hit_at' => Carbon::now()->format('Y-m-d H:i:s'),
            'shorten_id' => $shorten->id
        ]);
    }

Ao correr os testes, dá tudo vermelho! É claro que sim, para que o teste passe foi preciso criar:

  • Tabela (Migração)
  • Modelo (Stat)
  • Criar o registo quando há um redirect.

No RedirectController ficou assim, numa primeira fase,

	public function index($token)
    {
        $shorten = Shorten::whereToken($token)->first();
        Stat::create(['shorten_id' => $shorten->id, 'hit_at' => Carbon::now()]);
        return redirect($shorten->url);
    }

O refactor vem a seguir! :P

O segundo teste foi como obter a listagem de todas as estatísticas de um dado token:

    /** @test */
    public function can_retrive_stats_by_token ()
    {
        $shorten = factory(Shorten::class)->create();
        $stats = factory(Stat::class, 10)->create(['shorten_id' => $shorten->id]);
        $response = $this->getJson("api/shorten/stats/{$shorten->token}");
        $this->assertCount(10, $response->json());
    }

Para este teste poder passar, foi preciso criar:

  • Novo endpoint
  • Controller
  • Relação dos modelos.

No final o RedirectController ficou na sua fase final, pelo menos para já:

    public function index($token)
    {
        $shorten = Shorten::whereToken($token)->first();
        $shorten->stats()->create(['hit_at' => Carbon::now()]);
        return redirect($shorten->url);
    }

E com isto fica feito a nossa aplicação! Está quase feita xD

Podes obter todos os sources code aqui:
https://github.com/gravataLonga/pitly

I don't know why all developer say, "Proudly Hosted by DigitalOcean".

© 2017 · 2018