5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-22 23:56:22 +00:00

testear la relación belongs_to

belongs_to indica que un artículo pertenece a otro, la relación inversa
es un has_many.

en este caso nos fuimos dando cuenta que las memoizaciones nos juegan en
contra, así que las vamos eliminando del código cuando no hacen falta.

utilizamos `value = value.filtrado` para aprovechar
`MetadataTemplate#value=` que guarda el valor anterior en
`MetadataTemplate#value_was` y nos permite comparar entre el valor
anterior y el actual.
This commit is contained in:
f 2021-05-13 19:44:21 -03:00
parent 42923c4e04
commit 38c5cdef81
2 changed files with 53 additions and 18 deletions

View file

@ -3,13 +3,6 @@
# Almacena el UUID de otro Post y actualiza el valor en el Post # Almacena el UUID de otro Post y actualiza el valor en el Post
# relacionado. # relacionado.
class MetadataBelongsTo < MetadataRelatedPosts class MetadataBelongsTo < MetadataRelatedPosts
def value_was=(new_value)
@belongs_to = nil
@belonged_to = nil
super(new_value)
end
# TODO: Convertir algunos tipos de valores en módulos para poder # TODO: Convertir algunos tipos de valores en módulos para poder
# implementar varios tipos de campo sin repetir código # implementar varios tipos de campo sin repetir código
# #
@ -39,10 +32,14 @@ class MetadataBelongsTo < MetadataRelatedPosts
# Si estamos cambiando la relación, tenemos que eliminar la relación # Si estamos cambiando la relación, tenemos que eliminar la relación
# anterior # anterior
belonged_to[inverse].value.delete post.uuid.value if changed? && belonged_to.present? if belonged_to.present?
belonged_to[inverse].value = belonged_to[inverse].value.reject do |rej|
rej == post.uuid.value
end
end
# No duplicar las relaciones # No duplicar las relaciones
belongs_to[inverse].value << post.uuid.value unless belongs_to.blank? || included? belongs_to[inverse].value = (belongs_to[inverse].value.dup << post.uuid.value) unless belongs_to.blank? || included?
true true
end end
@ -63,20 +60,13 @@ class MetadataBelongsTo < MetadataRelatedPosts
end end
# El Post relacionado con este artículo # El Post relacionado con este artículo
#
# XXX: Memoizamos usando el valor para tener el valor siempre
# actualizado.
def belongs_to def belongs_to
return if value.blank? posts.find(value, uuid: true) if value.present?
@belongs_to ||= posts.find(value, uuid: true)
end end
# El artículo relacionado anterior # El artículo relacionado anterior
def belonged_to def belonged_to
return if value_was.blank? posts.find(value_was, uuid: true) if value_was.present?
@belonged_to ||= posts.find(value_was, uuid: true)
end end
def related_posts? def related_posts?

View file

@ -0,0 +1,45 @@
# frozen_string_literal: true
require 'test_helper'
require_relative 'metadata_test'
class MetadataBelongsToTest < ActiveSupport::TestCase
include MetadataTest
test 'se pueden relacionar artículos' do
post = @site.posts.create(layout: :post, title: SecureRandom.hex)
reply = @site.posts.create(layout: :post, title: SecureRandom.hex, in_reply_to: post.uuid.value)
assert_equal post, reply.in_reply_to.belongs_to
assert_includes post.posts.has_many, reply
end
test 'se puede eliminar la relación' do
post = @site.posts.create(layout: :post, title: SecureRandom.hex)
reply = @site.posts.create(layout: :post, title: SecureRandom.hex, in_reply_to: post.uuid.value)
reply.in_reply_to.value = ''
reply.save
assert_not_equal post, reply.in_reply_to.belongs_to
assert_equal post, reply.in_reply_to.belonged_to
assert_nil reply.in_reply_to.belongs_to
assert_not_includes post.posts.has_many, reply
end
test 'se puede cambiar la relación' do
post1 = @site.posts.create(layout: :post, title: SecureRandom.hex)
post2 = @site.posts.create(layout: :post, title: SecureRandom.hex)
reply = @site.posts.create(layout: :post, title: SecureRandom.hex, in_reply_to: post1.uuid.value)
reply.in_reply_to.value = post2.uuid.value
reply.save
assert_not_equal post1, reply.in_reply_to.belongs_to
assert_equal post1, reply.in_reply_to.belonged_to
assert_not_includes post1.posts.has_many, reply
assert_equal post2, reply.in_reply_to.belongs_to
assert_includes post2.posts.has_many, reply
end
end