Problema ao adicionar um teste unitário simples para Youtube oneboxing

Olá!

Quero adicionar suporte para links do Youtube /shorts/.

Minha modificação da classe YoutubeOnebox funciona, mas é necessário adicionar um teste em youtube_onebox.rb e meu teste não funciona.

Semelhante ao teste "can parse youtube embed results", adicionei este código:

it "can parse youtube shorts results" do
  preview = expect(Onebox.preview('https://www.youtube.com/watch?v=wi2jAtpBl0Y').placeholder_html)
  preview.to match(/From which sound/)
  preview.to match(/hqdefault/)
end

Também adicionei isto no início do arquivo, em before do:

stub_request(:get, "https://www.youtube.com/shorts/wi2jAtpBl0Y").to_return(status: 200, body: onebox_response("youtube-shorts"))

Nunca fiz testes unitários antes, então não entendo muito bem todo esse trabalho.

Minha falha no teste:

Failures:

  1) Onebox::Engine::YoutubeOnebox can parse youtube shorts results
     Failure/Error:
               http.request(request) do |response|

                 if cookie = response.get_fields('set-cookie')
                   # HACK: If this breaks again in the future, use HTTP::CookieJar from gem 'http-cookie'
                   # See test: it "does not send cookies to the wrong domain"
                   redir_header = { 'Cookie' => cookie.join('; ') }
                 end

                 redir_header = nil unless redir_header.is_a? Hash

     WebMock::NetConnectNotAllowedError:
       Real HTTP connections are disabled. Unregistered request: GET https://www.youtube.com/embed/wi2jAtpBl0Y with headers {'Accept' => '*/*', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent' => 'Discourse Forum Onebox v2.9.0.beta12'}

       You can stub this request with the following snippet:

       stub_request(:get, "https://www.youtube.com/embed/wi2jAtpBl0Y").
         with(
           headers: {
          'Accept' => '*/*',
          'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
          'User-Agent' => 'Discourse Forum Onebox v2.9.0.beta12'
           }).
         to_return(status: 200, body: "", headers: {})

       registered request stubs:

       stub_request(:get, "https://www.youtube.com/shorts/wi2jAtpBl0Y")
       stub_request(:get, "https://www.youtube.com/embed/KCyIfcevExE")
       stub_request(:get, "https://www.youtube.com/playlist?list=PL530892E5749D1696")
       stub_request(:get, "http://www.youtube.com/user/googlechrome")
       stub_request(:get, "https://www.youtube.com/channel/UCL8ZULXASCc1I_oaOT0NaOQ")
       stub_request(:get, "https://www.youtube.com/watch?v=21Lk4YiASMo")
       stub_request(:get, "http://www.youtube.com/watch?v=21Lk4YiASMo")
       stub_request(:get, "https://www.youtube.com/embed/21Lk4YiASMo")
       stub_request(:get, "https://youtu.be/21Lk4YiASMo")
       stub_request(:get, "https://www.youtube.com/watch?feature=player_embedded&v=21Lk4YiASMo")

       ============================================================
     # ./lib/onebox/helpers.rb:83:in `block in fetch_response'
     # ./lib/onebox/helpers.rb:69:in `fetch_response'
     # ./lib/onebox/helpers.rb:28:in `fetch_html_doc'
     # ./lib/onebox/engine/youtube_onebox.rb:21:in `parse_embed_response'
     # ./lib/onebox/engine/youtube_onebox.rb:42:in `placeholder_html'
     # ./lib/onebox/preview.rb:28:in `placeholder_html'
     # ./spec/lib/onebox/engine/youtube_onebox_spec.rb:110:in `block (2 levels) in <main>'
     # ./spec/rails_helper.rb:328:in `block (2 levels) in <top (required)>'

Finished in 0.89418 seconds (files took 5.04 seconds to load)
17 examples, 1 failure

Failed examples:

rspec ./spec/lib/onebox/engine/youtube_onebox_spec.rb:109 # Onebox::Engine::YoutubeOnebox can parse youtube shorts results

Você tem alguma ideia do porquê falha?

Além disso, o que essas partes fazem em before do?

onebox_response("youtube-embed")

A string “youtube-embed” não parece ser usada em nenhum lugar no código do Discourse, exceto aqui. Qual é o seu propósito?

Por que existem links /embed/ duas vezes e por que onebox_response tem um parâmetro de string diferente?

stub_request(:get, "https://www.youtube.com/embed/21Lk4YiASMo")
.to_return(status: 200, body: onebox_response("youtube"))
stub_request(:get, "https://www.youtube.com/embed/KCyIfcevExE")
.to_return(status: 200, body: onebox_response("youtube-embed"))
1 curtida

Eu também não sou muito bom nisso, mas você precisa fazer com que esse stub tenha exatamente as mesmas coisas que o YouTube retornaria. Portanto, ele precisa ter um subconjunto do que wget https://www.youtube.com/embed/wi2jAtpBl0Y retorna. É isso que sua especificação precisa como entrada.

wc wi2jAtpBl0Y 
    6   251 65245 wi2jAtpBl0Y

Essa é muita informação para entender e colocar no seu stub.

1 curtida

Você pode abrir um PR rascunho com suas alterações atuais? Isso facilitará o acompanhamento e a ajuda. Com as informações atuais, parece que você precisa criar os arquivos stub e stub e as requisições de saída.

2 curtidas

Claro, aqui está!

3 curtidas

Eu corrigi isso em um novo PR que tem a atribuição correta para você como Coautor:

Para que nossa suíte de testes não dependa de uma conexão de internet funcional (e do Youtube funcionando), nós “stubamos” todas as requisições de internet, fazendo com que essas chamadas retornem com uma resposta em cache. A função onebox_response chamará o arquivo com um nome correspondente ao parâmetro passado da pasta discourse/spec/fixtures/onebox at main · discourse/discourse · GitHub.

Adicionei um novo arquivo .response para um shorts, para que tenhamos um bom teste, mas foi tudo o que foi necessário para isso. Obrigado pelo PR!

3 curtidas

Testando onebox de shorts:

https://youtube.com/shorts/VvoFuaLAslw

1 curtida

Vídeo indisponível
O remetente não disponibilizou este vídeo no seu país

Fora isso, deve funcionar :smile:

1 curtida

E quanto a

?

Funciona para mim.

Pergunta rápida. Aqui está a notificação por e-mail que recebi:

A URL aqui é /embed/ e não /shorts/, mas suponho que isso seja normal?

1 curtida

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.