Adding some polls API endpoints for PR to discourse_api, which work fine. Now I’m trying to understand how to create tests before submitting the PR, e.g.:
require 'spec_helper'
describe DiscourseApi::API::Polls do
subject { DiscourseApi::Client.new("http://localhost:3000", "test_d7fd0429940", "test_user" )}
describe "#polls" do
before do
stub_get("http://localhost:3000/polls/voters.json").to_return(body: fixture("voters.json"), headers: { content_type: "application/json" })
end
it "requests the correct resource" do
subject.voters :post_id => 27885, :poll_name => 'poll'
expect(a_get("http://localhost:3000/polls/voters.json")).to have_been_made
end
end
end
But am getting the error:
Failed to open TCP connection to localhost:3000 (Connection refused - connect(2) for "localhost" port 3000)
# ./lib/discourse_api/client.rb:141:in `rescue in request'
# ./lib/discourse_api/client.rb:132:in `request'
# ./lib/discourse_api/client.rb:85:in `get'
# ./lib/discourse_api/api/polls.rb:22:in `voters'
# ./spec/discourse_api/api/polls_spec.rb:12:in `block (3 levels) in <top (required)>'
# ------------------
# --- Caused by: ---
# Errno::ECONNREFUSED:
# Connection refused - connect(2) for "localhost" port 3000
# /Users/kimardenmiller/.rbenv/versions/2.5.3/gemsets/d_api/gems/webmock-2.3.2/lib/webmock/http_lib_adapters/net_http.rb:109:in `request'
All the existing tests pass fine for me, and I’m trying to copy the format of those existing tests, but cannot for the life of me figure out what I’m doing wrong.
Here’s the (new) endpoint being tested:
module DiscourseApi
module API
module Polls
def poll_voters(args)
args = API.params(args) # post_id, poll_name, user, opts = {}
.required(:post_id, :poll_name)
.optional(:opts, :api_username)
response = get("/polls/voters.json", args)
response[:body]
end
end
end
end
Have working tests, though my gut tells me I could use tips on making those urls more elegant.
require 'spec_helper'
describe DiscourseApi::API::Polls do
subject { DiscourseApi::Client.new("http://localhost:3000", "test_d7fd0429940", "test_user" )}
describe "#polls" do
before do
stub_get("http://localhost:3000/polls/voters.json?post_id=27885&poll_name=poll").to_return(body: fixture("polls_voters.json"), headers: { content_type: "application/json" })
end
it "requests the correct resource" do
subject.poll_voters post_id: 27885, poll_name: 'poll'
expect(a_get("http://localhost:3000/polls/voters.json?post_id=27885&poll_name=poll")).to have_been_made
end
it "returns the expected votes" do
voters = subject.poll_voters post_id: 27885, poll_name: 'poll'
expect(voters).to be_a Hash
voters.each { |g| expect(g).to be_an Array }
expect(voters['voters']['e539a9df8700d0d05c69356a07b768cf']).to be_an Array
expect(voters['voters']['e539a9df8700d0d05c69356a07b768cf'][0]['id']).to eq(356)
end
end
end
Glad you got the tests working. They can be tricky sometimes because if the request doesn’t match exactly it will try and create an actual request rather that using the stubbed request.
I think the urls are okay. It would be nice not to use such a high post_id, but I’m not concerned about that. And ALL the tests need to have http://localhost:3000 extracted out into a common variable, but that should probably be done in a separate commit. Whenever you are ready you can go ahead and submit a pr and I can review it.
One thing I did notice though is I that passing in the api_username as a parameter is no longer supported.
This is because the discourse_api gem now only passes in the auth via the headers, and discourse core ignores any auth credentials in the body if the header is already being used for auth.
이것은 예시용이므로, 이 관련 내용은 examples 디렉토리 안에 두어야 하며 lib 디렉토리 안의 기존 기능에 영향을 주어서는 안 됩니다. config.yml 파일도 examples 디렉토리 안에 배치해야 합니다. yaml 파일을 로드하는 것은 매우 가볍고 각 예시 파일 상단에 추가할 수 있지만, examples 디렉토리 안의 공통 파일에 추가하여 모든 예시 파일에서 이를 읽을 수 있도록 하는 것이 더 나을 것입니다.
# host 예: localhost:3000 또는 discourse.my_domain.com
host: YOUR_HOST_NAME
# api 사용자 (결과에 영향을 줄 수 있음, 예: .categories 메서드는 api_username이 볼 수 있는 카테고리만 반환)
# api 사용자를 변경할 경우 새로운 클라이언트를 생성하십시오
api_username: YOUR_API_KEY
# Discourse 관리 패널 /admin/api/keys에서 가져온 api 키
api_key: YOUR_API_KEY
좋아 보입니다. 예제 헬퍼에 기본값을 추가해서 yml 파일 없이도 작동하도록 업데이트합시다. 그런 다음 readme에 예제 yml 파일을 examples/config.yml로 복사하는 방법을 설명하는 지침을 추가하세요. 그리고 examples/config.yml을 .gitignore에 반드시 추가하세요.
이것은 프로덕션 자격 증명이 포함된 config.yml 파일을 실수로 커밋하지 않도록 하는 꽤 표준적인 관행입니다. 또한 파일을 수정해도 git이 변경사항으로 인식하지 않습니다.
현재의 Testing 섹션이 다소 혼란스럽습니다. discourse_api 관련 작업과 Discourse 자체의 설치가 뒤섞여 있기 때문입니다. 예를 들어, 클라우드에 스테이징 서버가 있는 경우 로컬에 Discourse를 설치할 필요가 전혀 없습니다. 다음 제안에 대해 어떻게 생각하시나요?