114 lines
3.4 KiB
Ruby
114 lines
3.4 KiB
Ruby
require "rails_helper"
|
|
|
|
RSpec.describe Exporter::Comments, type: :service do
|
|
let(:user) { create(:user) }
|
|
let(:article) { create(:article) }
|
|
let(:podcast_episode) { create(:podcast_episode) }
|
|
let(:comment) { create(:comment, user: user, commentable: article) }
|
|
let(:podcast_episode_comment) { create(:comment, user: user, commentable: podcast_episode) }
|
|
let(:other_user) { create(:user) }
|
|
let(:other_user_comment) { create(:comment, user: other_user, commentable: article) }
|
|
|
|
def valid_instance(user)
|
|
described_class.new(user)
|
|
end
|
|
|
|
def expected_fields
|
|
%w[
|
|
body_markdown
|
|
created_at
|
|
deleted
|
|
edited
|
|
edited_at
|
|
id_code
|
|
markdown_character_count
|
|
positive_reactions_count
|
|
processed_html
|
|
receive_notifications
|
|
commentable_path
|
|
]
|
|
end
|
|
|
|
def load_comments(data)
|
|
JSON.parse(data["comments.json"])
|
|
end
|
|
|
|
describe "#initialize" do
|
|
it "accepts a user" do
|
|
exporter = valid_instance(user)
|
|
expect(exporter.user).to be(user)
|
|
end
|
|
|
|
it "names itself comments" do
|
|
exporter = valid_instance(user)
|
|
expect(exporter.name).to eq(:comments)
|
|
end
|
|
end
|
|
|
|
describe "#export" do
|
|
context "when id code is unknown" do
|
|
it "returns no comments if the id code is not found" do
|
|
exporter = valid_instance(user)
|
|
result = exporter.export(id_code: "not found")
|
|
comments = load_comments(result)
|
|
expect(comments).to be_empty
|
|
end
|
|
|
|
it "no comments if id code belongs to another user" do
|
|
exporter = valid_instance(user)
|
|
result = exporter.export(id_code: other_user_comment.id_code)
|
|
comments = load_comments(result)
|
|
expect(comments).to be_empty
|
|
end
|
|
end
|
|
|
|
context "when id code is known" do
|
|
it "returns the comment" do
|
|
exporter = valid_instance(user)
|
|
result = exporter.export(id_code: comment.id_code)
|
|
comments = load_comments(result)
|
|
expect(comments.length).to eq(1)
|
|
end
|
|
|
|
it "returns only expected fields for the comment" do
|
|
exporter = valid_instance(user)
|
|
result = exporter.export(id_code: comment.id_code)
|
|
comments = load_comments(result)
|
|
expect(comments.first.keys).to match_array(expected_fields)
|
|
end
|
|
end
|
|
|
|
context "when all comments are requested" do
|
|
it "returns all the comments as json" do
|
|
exporter = valid_instance(comment.user)
|
|
result = exporter.export
|
|
comments = load_comments(result)
|
|
user.reload
|
|
expect(comments.length).to eq(user.comments.size)
|
|
end
|
|
|
|
it "returns only expected fields for the comment" do
|
|
exporter = valid_instance(comment.user)
|
|
result = exporter.export
|
|
comments = load_comments(result)
|
|
expect(comments.first.keys).to match_array(expected_fields)
|
|
end
|
|
end
|
|
|
|
describe "commentable path" do
|
|
it "contains the path of the article" do
|
|
exporter = valid_instance(user)
|
|
result = exporter.export(id_code: comment.id_code)
|
|
comments = load_comments(result)
|
|
expect(comments.first["commentable_path"]).to eq(article.path)
|
|
end
|
|
|
|
it "contains the path of the podcast episode" do
|
|
exporter = valid_instance(user)
|
|
result = exporter.export(id_code: podcast_episode_comment.id_code)
|
|
comments = load_comments(result)
|
|
expect(comments.first["commentable_path"]).to eq(podcast_episode.path)
|
|
end
|
|
end
|
|
end
|
|
end
|