# Falha no teste: sign\_in(Fabricate(:user))

**URL:** https://meta.discourse.org/t/failing-spec-sign-in-fabricate-user/146158
**Category:** Development
**Created:** [Março 30, 2020, 4:33pm UTC](https://meta.discourse.org/t/failing-spec-sign-in-fabricate-user/146158 "2020-03-30T16:33:14Z")
**Posts on this page:** 13
**Page:** 1

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [Março 30, 2020, 4:33pm UTC](https://meta.discourse.org/t/failing-spec-sign-in-fabricate-user/146158/1 "2020-03-30T16:33:14Z")

</div>

Tenho um teste que começou a falhar há alguns dias. Parece ser algo relacionado ao `timezone`? Não vejo como isso seja culpa do meu plugin, mas talvez eu esteja perdendo algo?

```ruby
require 'rails_helper'

describe TopicDefaultTag::ActionsController do
  before do
    Jobs.run_immediately!
  end

  it 'can list' do
    sign_in(Fabricate(:user))
    get "/topic-default-tag/list.json"
    expect(response.status).to eq(200)
  end
end

```

```plaintext
Executando Rspec: plugins/discourse-topic-default-tag/spec/requests/actions_controller_spec.rb
Carregando plugins enquanto executa os testes

Ocorreu um erro ao carregar ./plugins/discourse-topic-default-tag/spec/requests/actions_controller_spec.rb.
Failure/Error: UserOption.create!(user_id: id)

NoMethodError:
  método `timezone' não definido para #<UserOption:0x000055dd7af16ca8>
  Significava? timeout
# ./app/models/user.rb:1343:in `create_user_option'
# (eval):19:in `block (2 levels) in run_file'
# ./spec/rails_helper.rb:79:in `<top (required)>'
# ./plugins/discourse-topic-default-tag/spec/requests/actions_controller_spec.rb:1:in `require'
# ./plugins/discourse-topic-default-tag/spec/requests/actions_controller_spec.rb:1:in `<top (required)>'
Nenhum exemplo encontrado.

Finalizado em 0,00005 segundos (os arquivos levaram 3,52 segundos para carregar)
0 exemplos, 0 falhas, 1 erro ocorreu fora dos exemplos

```

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [Março 30, 2020, 4:35pm UTC](https://meta.discourse.org/t/failing-spec-sign-in-fabricate-user/146158/2 "2020-03-30T16:35:11Z")

</div>

Parece que você está com a coluna de fuso horário faltando na sua tabela user\_options. Você executou as migrações recentemente no seu banco de dados de teste? `RAILS_ENV=test bin/rake db:migrate`

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [Março 30, 2020, 4:43pm UTC](https://meta.discourse.org/t/failing-spec-sign-in-fabricate-user/146158/3 "2020-03-30T16:43:20Z")

</div>

Por que, não! Não, eu não executei. Eu rodas as migrações no banco de dados de desenvolvimento, mas não no de teste. Obrigado, David!

Não entendo o que está acontecendo agora, mas provavelmente não é um problema tão iniciante assim. 😉

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [Março 30, 2020, 4:47pm UTC](https://meta.discourse.org/t/failing-spec-sign-in-fabricate-user/146158/4 "2020-03-30T16:47:25Z")

</div>

Você deve receber uma mensagem quando houver migrações pendentes

> <https://github.com/discourse/discourse/blob/29b35aa64c6e6c954f80004e58d41da9ef37c529/spec/rails_helper.rb#L180-L184>

Mas isso só funcionará se você estiver usando o `rails_helper`. Suspeito que você precise adicionar `require "rails_helper"` no topo do seu arquivo spec. Isso pode resolver também os outros problemas que você está enfrentando.

Edição: hmm… talvez devêssemos adicionar `--require rails_helper` ao arquivo `.rspec`, para que não seja necessário adicioná-lo manualmente 🤔

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [Março 30, 2020, 5:07pm UTC](https://meta.discourse.org/t/failing-spec-sign-in-fabricate-user/146158/5 "2020-03-30T17:07:09Z")

</div>

Isso parece o tipo de erro bobo que eu faria! Infelizmente, eu realmente tenho `require 'rails_helper'`.

Talvez executar `./bin/rake autospec` em vez de `bundle exec rake autospec` tenha sido o problema, mas ainda está falhando no Travis. Agora, esse spec parece estar fazendo um monte de coisas que eu não entendo para o meu único spec pequeno, mas vou apenas esperar e ver o que acontece.

Obrigado novamente.

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [Agosto 23, 2021, 7:41am UTC](https://meta.discourse.org/t/failing-spec-sign-in-fabricate-user/146158/6 "2021-08-23T07:41:34Z")

</div>

Estou tendo um problema com a função de ajuda `sign_in`, qualquer ajuda será muito apreciada! 🤯 :

> <https://github.com/discourse/discourse/blob/f1701764a68f9f5d5c785579001005eccda8b19a/spec/support/integration_helpers.rb#L28>

Quando usada neste teste, ela não parece entregar um `current_user` e falha com um 403 (em vez de um 200).

> <https://github.com/discourse/discourse-follow/blob/8920cd30b7f07c7a4cb99ac5e98405fead8daa66/spec/requests/follow_controller_spec.rb#L33>

Estou executando o teste assim para isolá-lo, mas não funciona de qualquer maneira:

`LOAD_PLUGINS=1 RAILS_ENV=test rspec plugins/discourse-follow/spec/requests/follow_controller_spec.rb:32`

Se eu adicionar um `byebug` no controlador correspondente e verificar o `current_user`, ele é `nil` (daí o `403`, imagino!):

> <https://github.com/discourse/discourse-follow/blob/8920cd30b7f07c7a4cb99ac5e98405fead8daa66/app/controllers/follow/follow_controller.rb#L9>

```plaintext
Randomized with seed 50945

[5, 14] in /home/merefield/code/discourse-follow/app/controllers/follow/follow_controller.rb
    5: def update
    6: params.require(:username)
    7: params.require(:follow)
    8: byebug
    9:
=\u003e 10: raise Discourse::InvalidAccess.new unless current_user
   11: raise Discourse::InvalidParameters.new if current_user.username == params[:username]
   12:
   13: if user = User.find_by(username: params[:username])
   14: updater = Follow::Updater.new(current_user, user)
(byebug) current_user
nil

```

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [Agosto 23, 2021, 12:22pm UTC](https://meta.discourse.org/t/failing-spec-sign-in-fabricate-user/146158/7 "2021-08-23T12:22:36Z")

</div>

Você tem um acima que cria esse usuário? (Não sou bom o suficiente para lembrar como se chama ou exatamente como fazer. Ah, um fabricador, talvez. Você fabricou esse usuário?

(ou talvez eu não tenha visto, pois estou no celular))

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [Agosto 23, 2021, 12:59pm UTC](https://meta.discourse.org/t/failing-spec-sign-in-fabricate-user/146158/8 "2021-08-23T12:59:18Z")

</div>

Sim, o usuário foi criado com sucesso. O objeto do usuário foi instanciado. O problema está dentro do método sign\_in ou tem algo a ver com o ambiente? (Mas isso deveria estar controlado)

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [Agosto 24, 2021, 3:56pm UTC](https://meta.discourse.org/t/failing-spec-sign-in-fabricate-user/146158/9 "2021-08-24T15:56:42Z")

</div>

Após uma investigação mais aprofundada, encontrei o seguinte:

em `def current_user` ([discourse/lib/auth/default\_current\_user\_provider.rb at 1472e47aae5bfdfb6fd9abfe89beb186c751f514 · discourse/discourse · GitHub](https://github.com/discourse/discourse/blob/1472e47aae5bfdfb6fd9abfe89beb186c751f514/lib/auth/default_current_user_provider.rb#L62))

`@env.key?(CURRENT_USER_KEY)` é `true`

portanto, `current_user` assume o valor de `@env[CURRENT_USER_KEY]`

No entanto, seu valor é `nil` quando essa linha é chamada do meu controlador durante uma execução de teste:

```plaintext
  def update
    params.require(:username)
    params.require(:follow)

    raise Discourse::InvalidAccess.new unless current_user

```

Não tenho certeza do motivo pelo qual `@env[CURRENT_USER_KEY]` seria `nil` após o login de um usuário dentro da especificação.

Notei que, durante a execução do teste, `current_user` é chamado várias vezes durante apenas um teste e, em um determinado momento, esse atributo possui um valor, mas não em todas as chamadas e não quando importa.

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [Agosto 24, 2021, 4:02pm UTC](https://meta.discourse.org/t/failing-spec-sign-in-fabricate-user/146158/10 "2021-08-24T16:02:17Z")

</div>

Você tem algum outro plugin instalado que possa estar interferindo no objeto current\_user? Clonei o `discourse-follow` e esse teste funciona para mim:

```plaintext
❯ LOAD_PLUGINS=1 bin/rspec plugins/discourse-follow/spec/requests/follow_controller_spec.rb   

Randomized with seed 28704
...

Finished in 0.45075 seconds (files took 3.34 seconds to load)
3 examples, 0 failures

Randomized with seed 28704

```

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [Agosto 24, 2021, 4:32pm UTC](https://meta.discourse.org/t/failing-spec-sign-in-fabricate-user/146158/11 "2021-08-24T16:32:27Z")

</div>

Ah, obrigado por verificar, David! Então deve ser algo peculiar na minha configuração de desenvolvimento!

Não, não há outros plugins instalados (além dos embutidos e do [data explorer](https://meta.discourse.org/t/32566?silent=true)), mas, já que funciona para você, estou inspirado a configurar uma nova instância limpa de dev no Docker e ver se consigo executá-la com sucesso por lá. Valeu! 🍻

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [Agosto 25, 2021, 10:35am UTC](https://meta.discourse.org/t/failing-spec-sign-in-fabricate-user/146158/12 "2021-08-25T10:35:26Z")

</div>

Sim, funcionou no dev do Docker:

`d/rake plugin:spec["discourse-follow"]`

obrigado!!

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [Agosto 26, 2021, 7:00am UTC](https://meta.discourse.org/t/failing-spec-sign-in-fabricate-user/146158/13 "2021-08-26T07:00:56Z")

</div>

Este tópico foi fechado automaticamente após 20 horas. Novas respostas não são mais permitidas.
