Follow official specs

This commit is contained in:
Frank Rousseau 2017-11-08 15:49:26 +01:00
parent 13e2841f13
commit 2a8c0ddd51
6 changed files with 107 additions and 9 deletions

View file

@ -8,19 +8,26 @@ module Api
protected
rescue_from Exception do |e|
pp e
logger.error e.message
render json: {error: e.message}, status: 500
end
rescue_from ActiveRecord::RecordNotFound do
pp e
logger.error e.message
render json: {error: I18n.t("api.error.not_found")}, status: 404
end
rescue_from ActiveRecord::RecordInvalid do |e|
pp e
logger.error e.message
render json: {error: e.to_s}, status: 400
end
rescue_from ActionController::ParameterMissing do |e|
pp e
logger.error e.message
render json: {
error: I18n.t("api.error.wrong_parameters"),
message: e.message

View file

@ -16,7 +16,14 @@ module Api
end
def index
conversations = conversation_service.all_for_user
filter = {}
if params[:only_after] then
filter["only_after"] = params[:only_after]
end
if params[:unread] then
filter["unread"] = params[:unread]
end
conversations = conversation_service.all_for_user(filter)
render json: conversations.map {|x| conversation_as_json(x) }
end

View file

@ -26,7 +26,10 @@ module Api
def index
conversation = conversation_service.find!(params[:conversation_id])
render json: conversation.messages.map {|x| message_json(x)}, status: 201
conversation.set_read(user)
render json: conversation.messages.map {
|x| message_json(x)
}, status: 201
end
def conversation_service

View file

@ -3,12 +3,21 @@ class ConversationService
@user = user
end
def all_for_user
Conversation.where(author_id: @user.person.id)
def all_for_user(filter={})
conversation_filter = {}
if !filter[:only_after].nil? then
conversation_filter = \
'conversations.created_at >= ?', filter[:only_after]
end
visibility_filter = {person_id: @user.person_id}
if filter[:unread] == true then
visibility_filter["unread"] = 0
end
Conversation.where(conversation_filter)
.joins(:conversation_visibilities)
.where(conversation_visibilities: {
person_id: @user.person_id
})
.where(conversation_visibilities: visibility_filter)
.all
end

View file

@ -24,6 +24,7 @@ describe Api::V0::ConversationsController do
context "with valid data" do
it "creates the conversation" do
post api_v0_conversations_path, @conversation
@conversation_guid = JSON.parse(response.body)["conversation"]["guid"]
conversation = JSON.parse(response.body)["conversation"]
expect(response.status).to eq 201
@ -31,6 +32,7 @@ describe Api::V0::ConversationsController do
expect(conversation["subject"]).to eq @conversation[:subject]
expect(conversation["created_at"]).to_not be_nil
expect(conversation["participants"].length).to eq 2
conversation_service.find!(@conversation_guid)
end
end
@ -46,13 +48,37 @@ describe Api::V0::ConversationsController do
before do
post api_v0_conversations_path, @conversation
post api_v0_conversations_path, @conversation
sleep(1)
post api_v0_conversations_path, @conversation
conversation_guid = JSON.parse(response.body)["conversation"]["guid"]
conversation = conversation_service.find!(conversation_guid)
conversation.conversation_visibilities[0].unread = 1
conversation.conversation_visibilities[0].save!
conversation.conversation_visibilities[1].unread = 1
conversation.conversation_visibilities[1].save!
@date = conversation.created_at
end
it "returns all the user conversations" do
get api_v0_conversations_path, access_token: access_token
expect(response.status).to eq 200
expect(JSON.parse(response.body).length).to eq 3
end
it "returns all the user unread conversations" do
get api_v0_conversations_path, unread: true, access_token: access_token
expect(response.status).to eq 200
expect(JSON.parse(response.body).length).to eq 2
end
it "returns all the user conversations after a given date" do
get(
api_v0_conversations_path,
only_after: @date, access_token: access_token
)
expect(response.status).to eq 200
expect(JSON.parse(response.body).length).to eq 1
end
end
describe "#show" do
@ -71,7 +97,6 @@ describe Api::V0::ConversationsController do
conversation = JSON.parse(response.body)["conversation"]
expect(conversation["guid"]).to eq conversation_guid
expect(conversation["subject"]).to eq @conversation[:subject]
expect(conversation["created_at"]).to_not be_nil
expect(conversation["participants"].length).to eq 2
expect(conversation["read"]).to eq true
end
@ -161,4 +186,9 @@ describe Api::V0::ConversationsController do
end
end
end
def conversation_service
ConversationService.new(alice)
end
end

View file

@ -7,9 +7,51 @@ describe ConversationService do
conversation = alice.build_conversation(opts)
conversation.save
describe "#all_for_user" do
before do
opts = {
subject: "conversation subject 2",
message: {text: "conversation text 2"},
participant_ids: [bob.person.id]
}
@conversation = alice.build_conversation(opts)
@conversation.save!
sleep(1)
@date = @conversation.created_at
opts = {
subject: "conversation subject 3",
message: {text: "conversation text 3"},
participant_ids: [bob.person.id]
}
@conversation = alice.build_conversation(opts)
@conversation.save!
end
it "returns all conversations" do
expect(alice_conversation_service.all_for_user().length).to eq(3)
expect(bob_conversation_service.all_for_user().length).to eq(3)
end
it "returns all unread conversations" do
@conversation.conversation_visibilities[0].unread = true
@conversation.conversation_visibilities[0].save!
conversations = bob_conversation_service.all_for_user(
filter={unread: true}
)
expect(conversations.length).to eq(2)
end
it "returns conversation after a given date" do
conversations = bob_conversation_service.all_for_user(
filter={only_after: @date}
)
expect(conversations.length).to eq(2)
end
end
describe "#find!" do
it "returns the conversation, if it is the user's conversation" do
expect(alice_conversation_service.find!(conversation.guid)).to eq(
expect(bob_conversation_service.find!(conversation.guid)).to eq(
conversation
)
end