ver las ultimas posiciones closes #6

This commit is contained in:
fauno 2019-04-21 01:02:11 -03:00
parent 096c9384a0
commit bc83b7a6c7
No known key found for this signature in database
GPG key ID: 456032D717A4CD9C
5 changed files with 74 additions and 3 deletions

View file

@ -16,4 +16,15 @@ class Posicion < ApplicationRecord
# Solo puede tener alguno de los estados definidos
validates :estado, inclusion: { in: Posicion::ESTADOS }
# Obtener las últimas posiciones por cada pirata. Para no hacer
# consultas complejas, obtenemos primero los IDs de las posiciones y
# luego traemos solo esas.
scope :ultimas, lambda {
ids = select('id, max(created_at) as created_at')
.group(:pirata_id)
.collect(&:id)
where(id: ids)
}
end

View file

@ -2,4 +2,8 @@
json.call(consenso, :id, :created_at, :titulo, :texto)
json.posiciones consenso.posiciones, partial: 'posiciones/posicion', as: :posicion
ultimas ||= false
posiciones = consenso.posiciones
posiciones = posiciones.ultimas if ultimas
json.posiciones posiciones, partial: 'posiciones/posicion', as: :posicion

View file

@ -1,3 +1,4 @@
# frozen_string_literal: true
json.consensos @consensos, partial: 'consensos/consenso', as: :consenso
json.consensos @consensos, partial: 'consensos/consenso', as: :consenso,
locals: { ultimas: true }

View file

@ -8,7 +8,9 @@ class ConsensosControllerTest < ActionDispatch::IntegrationTest
end
test 'se pueden mostrar' do
2.times { create :consenso }
2.times do
create :consenso
end
get consensos_url, as: :json, headers: @auth
body = JSON.parse(@response.body)
@ -17,6 +19,24 @@ class ConsensosControllerTest < ActionDispatch::IntegrationTest
assert_equal 2, body['consensos'].size
end
test 'al mostrar solo se ven las posiciones resumidas' do
2.times do
consenso = create :consenso
pirata = create :pirata
3.times do
create :posicion, consenso: consenso, pirata: pirata
end
end
get consensos_url, as: :json, headers: @auth
body = JSON.parse(@response.body)
body['consensos'].each do |consenso|
assert_equal 1, consenso['posiciones'].count
end
end
test 'se puede ver uno solo' do
consenso = create :consenso, con_posiciones: 2
@ -28,6 +48,20 @@ class ConsensosControllerTest < ActionDispatch::IntegrationTest
assert_equal 2, body['posiciones'].size
end
test 'al ver uno solo se ve todo el historial de posiciones' do
consenso = create :consenso
pirata = create :pirata
3.times do
create :posicion, consenso: consenso, pirata: pirata
end
get consenso_url(consenso), as: :json, headers: @auth
body = JSON.parse(@response.body)
assert_equal 3, body['posiciones'].size
end
test 'se pueden crear' do
post consensos_url, as: :json, headers: @auth, params: {
consenso: {

View file

@ -8,4 +8,25 @@ class PosicionTest < ActiveSupport::TestCase
assert_equal true, posicion.valid?
end
test 'se pueden saber las últimas' do
consenso = create :consenso
piratas = []
2.times do
piratas.push create :pirata
end
5.times do
create :posicion,
pirata: piratas.sample,
consenso: consenso,
created_at: (1..100).to_a.sample.days.ago
end
posicion1 = create :posicion, pirata: piratas.first, consenso: consenso
posicion2 = create :posicion, pirata: piratas.last, consenso: consenso
assert_equal [posicion1.id, posicion2.id].sort,
consenso.posiciones.ultimas.collect(&:id).sort
end
end