Isso resolveu o erro. Eu assumi que, como não conseguia encontrar a Classe antes, ela estava sendo tratada como uma Constante? De qualquer forma, isso foi resolvido, brilhante, muito obrigado! Estou desimpedido!
Então, o motivo pelo qual eu tinha isso:
user.approved = true
user.approved_by_id = Discourse.system_user.id
antes de:
reviewable.perform(:approve, Discourse.system_user)
é porque a adição à fila de revisão é assíncrona. No job, a revisão só é criada se o approve for falso em (discourse/app/jobs/regular/create_user_reviewable.rb at 888e68a1637ca784a7bf51a6bbb524dcf7413b13 · discourse/discourse · GitHub):
if user = User.find_by(id: args[:user_id])
return if user.approved?
@reviewable = ReviewableUser.needs_review!(
target: user,
created_by: Discourse.system_user,
reviewable_by_moderator: true,
payload: {
username: user.username,
name: user.name,
email: user.email
}
)
Existe o risco de o job ser disparado depois de você ter testado a entrada de revisão?
O resultado disso é que a entrada de revisão parece não existir, mas o job está apenas aguardando para ser executado. O job então é executado e cria a entrada de revisão, e você perdeu a oportunidade de limpá-la, pois seu código de teste já foi executado.
É uma condição de corrida potencial?
Defina approved como true antes de verificar a entrada de revisão e você terá resolvido o problema (porque uma revisão nunca será criada após isso, já que é uma dependência).
Eu me deparei com esse problema ao testar meu código — no dev funcionou, mas na produção falhou, pois as coisas foram executadas em uma ordem diferente.
NB: Agradeço que você não tenha escrito isso para suportar este caso de uso, mas acho importante permitir que plugins possam aprovar automaticamente novos usuários em circunstâncias especiais (como o plugin do Discord, que faz isso se o usuário for membro de uma guilda confiável).