From 56e51a0a6d5a63518833458522472d93623c7b6a Mon Sep 17 00:00:00 2001 From: Aiandrox Date: Fri, 5 Jun 2020 14:53:27 +0900 Subject: [PATCH] =?UTF-8?q?[Pend]=20'api/v1/tags/:id/registered=5Ftags'?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0=EF=BC=88=E3=81=97=E3=81=9F=E3=81=84?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/tag_registered_tags_controller.rb | 14 ++++ .../api/v1/tag_registered_tags_spec.rb | 76 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 app/controllers/api/v1/tag_registered_tags_controller.rb create mode 100644 spec/requests/api/v1/tag_registered_tags_spec.rb diff --git a/app/controllers/api/v1/tag_registered_tags_controller.rb b/app/controllers/api/v1/tag_registered_tags_controller.rb new file mode 100644 index 00000000..35d6c844 --- /dev/null +++ b/app/controllers/api/v1/tag_registered_tags_controller.rb @@ -0,0 +1,14 @@ +class Api::V1::TagRegisteredTagsController < Api::V1::BaseController + # TODO: 同じハッシュタグのregistered_tagsを返す。テストも書けていない。 + def index + tag = Tag.find(params[:tag_id]) + registered_tags = tag.registered_tags.published + if (count = params[:count]) + registered_tags.limit!(count) + else + @pagy, registered_tags = pagy(registered_tags) + end + render json: registered_tags + # user.nameを含む。自らのリソース(RegisteredTag.find_by(tag_id: tag.id))は含まない + end +end diff --git a/spec/requests/api/v1/tag_registered_tags_spec.rb b/spec/requests/api/v1/tag_registered_tags_spec.rb new file mode 100644 index 00000000..f389c8ab --- /dev/null +++ b/spec/requests/api/v1/tag_registered_tags_spec.rb @@ -0,0 +1,76 @@ +RSpec.xdescribe 'TagRegisteredTags', type: :request do + describe 'GET /api/v1/tags/:id/registered_tags' do + let(:tag) { create(:tag) } + let(:tags_json) { json['registeredTags'] } + let!(:tag_registered_tag) { create(:registered_tag, tag: tag) } + let!(:other_registered_tag) { create(:registered_tag) } + + describe '全般的なこと' do + before do + create_list(:registered_tag, 10, tag: tag) + get "/api/v1/tags/#{tag.id}/registered_tags" + end + it '200 OKを返す' do + expect(response.status).to eq 200 + end + it '指定のハッシュタグのregistered_tagのみ含む' do + # expect(json['registeredTags']).to include tag_registered_tag.tag.name + # expect(json['registeredTags']).not_to include other_registered_tag.tag.name + end + it 'Tag.registered_tagsのJSONを返す' do + registered_tags = tag.registered_tags + tags_json.zip(registered_tags).each do |tag_json, registered_tag| + expect(tag_json).to eq({ + 'id' => registered_tag.id, + 'tweetedDayCount' => registered_tag.tweeted_day_count, + 'privacy' => registered_tag.privacy_i18n, + 'remindDay' => registered_tag.remind_day, + 'firstTweetedAt' => registered_tag.first_tweeted_at, + 'lastTweetedAt' => registered_tag.last_tweeted_at, + 'tag' => { + 'id' => registered_tag.tag.id, + 'name' => registered_tag.tag.name, + } + }) + end + end + context 'registered_tagが限定公開のとき' do + let(:limited_registered_tag) { create(:registered_tag, :limited, tag: tag) } + it '含まない' do + + end + end + context 'registered_tagが非公開のとき' do + let(:closed_registered_tag) { create(:registered_tag, :closed, tag: tag) } + it '含まない' do + end + end + end + + context 'countクエリがないとき' do + describe 'pagy' do + before do + create_list(:registered_tag, 50, tag: tag) + get "/api/v1/tags/#{tag.id}/registered_tags" + end + it 'pageクエリがないとき 20件返す' do + expect(tags_json.length).to eq 20 + end + it 'page=2のとき 20件返す' do + get '/api/v1/tags?page=2' + expect(tags_json.length).to eq 20 + end + end + end + context 'countクエリがあるとき' do + let(:count) { rand(1..5) } + before do + create_list(:registered_tag, 10, tag: tag) + get "/api/v1/tags/#{tag.id}/registered_tags?count=#{count}" + end + it 'countで指定したレコード数を返す' do + expect(tags_json.length).to eq count + end + end + end +end