|
|
@@ -795,4 +795,127 @@ RSpec.describe 'Posts API', type: :request do |
|
|
expect(user.reload.viewed?(post_record)).to be(false) |
|
|
expect(user.reload.viewed?(post_record)).to be(false) |
|
|
end |
|
|
end |
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
describe 'post versioning' do |
|
|
|
|
|
let(:member) { create(:user, :member) } |
|
|
|
|
|
|
|
|
|
|
|
def snapshot_tags(post) |
|
|
|
|
|
post.snapshot_tag_names.join(' ') |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
def create_post_version_for!(post) |
|
|
|
|
|
PostVersion.create!( |
|
|
|
|
|
post: post, |
|
|
|
|
|
version_no: 1, |
|
|
|
|
|
event_type: 'create', |
|
|
|
|
|
title: post.title, |
|
|
|
|
|
url: post.url, |
|
|
|
|
|
thumbnail_base: post.thumbnail_base, |
|
|
|
|
|
tags: snapshot_tags(post), |
|
|
|
|
|
parent: post.parent, |
|
|
|
|
|
original_created_from: post.original_created_from, |
|
|
|
|
|
original_created_before: post.original_created_before, |
|
|
|
|
|
created_at: post.created_at, |
|
|
|
|
|
created_by_user: post.uploaded_user |
|
|
|
|
|
) |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
it 'creates version 1 on POST /posts' do |
|
|
|
|
|
sign_in_as(member) |
|
|
|
|
|
|
|
|
|
|
|
expect do |
|
|
|
|
|
post '/posts', params: { |
|
|
|
|
|
title: 'versioned post', |
|
|
|
|
|
url: 'https://example.com/versioned-post', |
|
|
|
|
|
tags: 'spec_tag', |
|
|
|
|
|
thumbnail: dummy_upload |
|
|
|
|
|
} |
|
|
|
|
|
end.to change(PostVersion, :count).by(1) |
|
|
|
|
|
|
|
|
|
|
|
expect(response).to have_http_status(:created) |
|
|
|
|
|
|
|
|
|
|
|
created_post = Post.find(json.fetch('id')) |
|
|
|
|
|
version = PostVersion.find_by!(post: created_post, version_no: 1) |
|
|
|
|
|
|
|
|
|
|
|
expect(version.event_type).to eq('create') |
|
|
|
|
|
expect(version.title).to eq('versioned post') |
|
|
|
|
|
expect(version.url).to eq('https://example.com/versioned-post') |
|
|
|
|
|
expect(version.created_by_user_id).to eq(member.id) |
|
|
|
|
|
expect(version.tags).to eq(snapshot_tags(created_post)) |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
it 'creates next version on PUT /posts/:id when snapshot changes' do |
|
|
|
|
|
sign_in_as(member) |
|
|
|
|
|
create_post_version_for!(post_record) |
|
|
|
|
|
|
|
|
|
|
|
tag_name2 = TagName.create!(name: 'spec_tag_2') |
|
|
|
|
|
Tag.create!(tag_name: tag_name2, category: :general) |
|
|
|
|
|
|
|
|
|
|
|
expect do |
|
|
|
|
|
put "/posts/#{post_record.id}", params: { |
|
|
|
|
|
title: 'updated title', |
|
|
|
|
|
tags: 'spec_tag_2' |
|
|
|
|
|
} |
|
|
|
|
|
end.to change(PostVersion, :count).by(1) |
|
|
|
|
|
|
|
|
|
|
|
expect(response).to have_http_status(:ok) |
|
|
|
|
|
|
|
|
|
|
|
version = post_record.reload.post_versions.order(:version_no).last |
|
|
|
|
|
expect(version.version_no).to eq(2) |
|
|
|
|
|
expect(version.event_type).to eq('update') |
|
|
|
|
|
expect(version.title).to eq('updated title') |
|
|
|
|
|
expect(version.created_by_user_id).to eq(member.id) |
|
|
|
|
|
expect(version.tags).to eq(snapshot_tags(post_record.reload)) |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
it 'does not create a new version on PUT /posts/:id when snapshot is unchanged' do |
|
|
|
|
|
sign_in_as(member) |
|
|
|
|
|
create_post_version_for!(post_record) |
|
|
|
|
|
|
|
|
|
|
|
expect do |
|
|
|
|
|
put "/posts/#{post_record.id}", params: { |
|
|
|
|
|
title: post_record.title, |
|
|
|
|
|
tags: 'spec_tag' |
|
|
|
|
|
} |
|
|
|
|
|
end.not_to change(PostVersion, :count) |
|
|
|
|
|
|
|
|
|
|
|
expect(response).to have_http_status(:ok) |
|
|
|
|
|
|
|
|
|
|
|
version = post_record.reload.post_versions.order(:version_no).last |
|
|
|
|
|
expect(version.version_no).to eq(1) |
|
|
|
|
|
expect(version.event_type).to eq('create') |
|
|
|
|
|
expect(version.tags).to eq(snapshot_tags(post_record)) |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
it 'does not create a version when POST /posts is invalid' do |
|
|
|
|
|
sign_in_as(member) |
|
|
|
|
|
|
|
|
|
|
|
expect do |
|
|
|
|
|
post '/posts', params: { |
|
|
|
|
|
title: 'invalid post', |
|
|
|
|
|
url: 'ぼざクリタグ広場', |
|
|
|
|
|
tags: 'spec_tag', |
|
|
|
|
|
thumbnail: dummy_upload |
|
|
|
|
|
} |
|
|
|
|
|
end.not_to change(PostVersion, :count) |
|
|
|
|
|
|
|
|
|
|
|
expect(response).to have_http_status(:unprocessable_entity) |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
it 'does not create a version when PUT /posts/:id is invalid' do |
|
|
|
|
|
sign_in_as(member) |
|
|
|
|
|
create_post_version_for!(post_record) |
|
|
|
|
|
|
|
|
|
|
|
expect do |
|
|
|
|
|
put "/posts/#{post_record.id}", params: { |
|
|
|
|
|
title: 'updated title', |
|
|
|
|
|
tags: 'spec_tag', |
|
|
|
|
|
original_created_from: Time.zone.local(2020, 1, 2, 0, 0, 0).iso8601, |
|
|
|
|
|
original_created_before: Time.zone.local(2020, 1, 1, 0, 0, 0).iso8601 |
|
|
|
|
|
} |
|
|
|
|
|
end.not_to change(PostVersion, :count) |
|
|
|
|
|
|
|
|
|
|
|
expect(response).to have_http_status(:unprocessable_entity) |
|
|
|
|
|
end |
|
|
|
|
|
end |
|
|
end |
|
|
end |