مشكلة في إضافة اختبار وحدة بسيط لـ Youtube oneboxing

أهلاً!

أريد إضافة دعم لرابط يوتيوب /shorts/.

تعديلي على الفئة YoutubeOnebox يعمل، ولكن يتطلب مني إضافة اختبار في youtube_onebox.rb واختباري لا يعمل.

على غرار اختبار “يمكن تحليل نتائج تضمين يوتيوب” (can parse youtube embed results)، أضفت هذا الكود:

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

كما أضفت هذا في بداية الملف، في before do:

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

لم أقم باختبارات الوحدة من قبل، لذلك لا أفهم حقًا كل هذا العمل.

فشل اختباري:

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

هل لديك أي فكرة لماذا يفشل؟

أيضًا، ماذا تفعل هذه الأجزاء في before do؟

onebox_response("youtube-embed")

السلسلة “youtube-embed” لا تبدو مستخدمة في أي مكان في كود Discourse باستثناء هنا. ما هو الغرض منها؟

لماذا توجد روابط /embed/ مرتين ولماذا يحتوي onebox_response على معامل سلسلة مختلف؟

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)

أنا لست جيدًا جدًا في هذا أيضًا، ولكن تحتاج إلى جعل هذا النموذج الأولي يحتوي على نفس الأشياء بالضبط التي ستعيدها يوتيوب. لذا، يجب أن يحتوي على مجموعة فرعية مما يعيده wget https://www.youtube.com/embed/wi2jAtpBl0Y. هذا هو ما يحتاجه مواصفاتك كمدخل لها.

wc wi2jAtpBl0Y 
    6   251 65245 wi2jAtpBl0Y

هذا الكثير من النص لفهمه ووضعه في النموذج الأولي الخاص بك.

إعجاب واحد (1)

هل يمكنك فتح مسودة طلب سحب (PR) بالتغييرات الحالية؟ سيكون ذلك أسهل للمتابعة والمساعدة. مع المعلومات الحالية، يبدو أنك بحاجة إلى إنشاء ملفات وهمية (stub files) ووهمية (stub) والطلبات الصادرة.

إعجابَين (2)

بالتأكيد، ها هو!

3 إعجابات

لقد قمت بإصلاحه في طلب سحب جديد (PR) ينسب الفضل إليك بشكل صحيح كمؤلف مشارك:

لجعل مجموعة الاختبارات لدينا لا تعتمد على اتصال إنترنت يعمل (ويوتيوب يعمل)، نقوم بتجاوز جميع طلبات الإنترنت عن طريق جعل هذه المكالمات تعود باستجابة مخبأة. ستقوم الدالة onebox_response باستدعاء الملف باسم مطابق للمعلمة التي تم تمريرها من المجلد discourse/spec/fixtures/onebox at main · discourse/discourse · GitHub.

لقد أضفت ملف .response جديدًا لمقاطع قصيرة حتى يكون لدينا اختبار جيد، ولكن هذا كل ما كان ضروريًا لهذا. شكرًا على طلب السحب!

3 إعجابات

اختبار onebox للمقاطع القصيرة:

https://youtube.com/shorts/VvoFuaLAslw

إعجاب واحد (1)

الفيديو غير متوفر
لم يقم المُحمِّل بإتاحة هذا الفيديو في بلدك

بجانب هذا، يجب أن يعمل :smile:

إعجاب واحد (1)

ماذا عن

؟

يعمل معي.

سؤال سريع. هذه هي إشعار البريد الإلكتروني الذي تلقيته:

الرابط هنا هو /embed/ وليس /shorts/، لكنني أفترض أن هذا طبيعي؟

إعجاب واحد (1)

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