Problème lors de l'ajout d'un simple test unitaire pour le oneboxing Youtube

Salut !

Je veux ajouter la prise en charge des liens YouTube /shorts/.

Ma modification de la classe YoutubeOnebox fonctionne, mais il est nécessaire que j’ajoute un test dans youtube_onebox.rb et mon test ne fonctionne pas.

Similaire au test "can parse youtube embed results", j’ai ajouté ce code :

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

J’ai aussi ajouté ceci au début du fichier, dans before do :

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

Je n’ai jamais fait de tests unitaires auparavant, donc je ne comprends pas vraiment tout ce travail.

Mon échec de test :

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=PL5308B2E5749D1696")
       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

Avez-vous une idée de pourquoi ça échoue ?

Aussi, que font ces parties dans before do ?

onebox_response("youtube-embed")

La chaîne “youtube-embed” ne semble être utilisée nulle part dans le code de Discourse sauf ici. Quel est son but ?

Pourquoi y a-t-il deux fois des liens /embed/ et pourquoi onebox_response a-t-il un paramètre de chaîne différent ?

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 « J'aime »

Je ne suis pas très doué non plus, mais vous devez faire en sorte que ce stub contienne exactement la même chose que ce que YouTube retournerait. Il doit donc contenir un sous-ensemble de ce que wget https://www.youtube.com/embed/wi2jAtpBl0Y retourne. C’est ce dont votre spécification a besoin comme entrée.

wc wi2jAtpBl0Y 
    6   251 65245 wi2jAtpBl0Y

C’est beaucoup de texte à comprendre et à intégrer dans votre stub.

1 « J'aime »

Pouvez-vous ouvrir une PR brouillon avec vos modifications actuelles ? Ce sera plus facile à suivre et à aider. Avec les informations actuelles, il semble que vous deviez créer les fichiers stub et les requêtes sortantes.

2 « J'aime »

Bien sûr, le voici !

3 « J'aime »

Je l’ai corrigé dans une nouvelle PR qui vous attribue correctement en tant que co-auteur :

Pour que notre suite de tests ne dépende pas d’une connexion Internet fonctionnelle (et de Youtube fonctionnel), nous simulons toutes les requêtes Internet en faisant en sorte que ces appels renvoient une réponse mise en cache. La fonction onebox_response appellera le fichier portant un nom correspondant au paramètre passé depuis le dossier discourse/spec/fixtures/onebox at main · discourse/discourse · GitHub.

J’ai ajouté un nouveau fichier .response pour un short afin d’avoir un bon test, mais c’était tout ce qui était nécessaire pour cela. Merci pour la PR !

3 « J'aime »

Test du onebox de shorts :

https://youtube.com/shorts/VvoFuaLAslw

1 « J'aime »

Vidéo indisponible
Le téléchargeur n’a pas rendu cette vidéo disponible dans votre pays

À part ça, ça devrait marcher :smile:

1 « J'aime »

Qu’en est-il de

?

Ça fonctionne pour moi.

Petite question. Voici la notification par e-mail que j’ai reçue :

L’URL ici est /embed/ et non /shorts/, mais je suppose que c’est normal ?

1 « J'aime »

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