유튜브 원박싱에 간단한 단위 테스트를 추가하는 중 문제 발생

안녕하세요!

YouTube /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"))

저도 이 부분은 잘 모르지만, 그 스텁이 YouTube가 반환하는 것과 정확히 동일한 내용을 포함해야 합니다. 즉, wget https://www.youtube.com/embed/wi2jAtpBl0Y가 반환하는 것의 일부가 필요합니다. 스펙의 입력값으로 이것이 필요합니다.

wc wi2jAtpBl0Y 
    6   251 65245 wi2jAtpBl0Y

이해하고 스텁에 넣을 텍스트가 꽤 많습니다.

현재 변경 사항을 포함하여 초안 PR을 열어 주실 수 있나요? 그렇게 하면 진행 상황을 따라가며 도움을 드리는 것이 더 쉬울 것입니다. 현재 정보로는 스텁 파일과 스텁, 그리고 외부 요청을 생성해야 하는 것으로 보입니다.

네, 여기 있습니다!

저를 공동 저자로 올바르게 표기된 새로운 PR에서 수정했습니다:

테스트 스위트가 작동하는 인터넷 연결(그리고 작동하는 YouTube)에 의존하지 않도록, 모든 인터넷 요청을 스텁하여 해당 호출이 캐시된 응답을 반환하도록 했습니다. onebox_response 함수는 discourse/spec/fixtures/onebox at main · discourse/discourse · GitHub 폴더에서 전달된 매개변수와 이름이 일치하는 파일을 호출합니다.

숏츠(shorts)에 대한 새로운 .response 파일을 추가하여 좋은 테스트를 갖추었지만, 이것이 이 문제를 해결하는 데 필요한 전부였습니다. PR 올려주셔서 감사합니다!

숏츠 원박스 테스트:

https://youtube.com/shorts/VvoFuaLAslw

비디오를 사용할 수 없습니다
업로더가 이 비디오를 사용자의 국가에서 사용할 수 없도록 설정했습니다

이것을 제외하면, 작동해야 합니다 :smile:

다음은 어때요?

?

나한테는 잘 작동해요.

간단한 질문이 있어요. 제가 받은 이메일 알림이 이렇습니다:

여기 URL이 /shorts/가 아니라 /embed/인데, 이게 정상적인 건가요?