-
Notifications
You must be signed in to change notification settings - Fork 926
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Note subscriptions db table #5284
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
# == Schema Information | ||
# | ||
# Table name: note_subscriptions | ||
# | ||
# user_id :bigint(8) not null, primary key | ||
# note_id :bigint(8) not null, primary key | ||
# | ||
# Indexes | ||
# | ||
# index_note_subscriptions_on_note_id (note_id) | ||
# | ||
# Foreign Keys | ||
# | ||
# fk_rails_... (note_id => notes.id) | ||
# fk_rails_... (user_id => users.id) | ||
# | ||
class NoteSubscription < ApplicationRecord | ||
belongs_to :user | ||
belongs_to :note | ||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
class CreateNoteSubscriptions < ActiveRecord::Migration[7.2] | ||
def change | ||
create_table :note_subscriptions, :primary_key => [:user_id, :note_id] do |t| | ||
t.references :user, :foreign_key => true, :index => false | ||
t.references :note, :foreign_key => true | ||
end | ||
end | ||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -101,10 +101,12 @@ def test_routes | |
) | ||
end | ||
|
||
def test_create_success | ||
def test_create_anonymous_success | ||
assert_difference "Note.count", 1 do | ||
assert_difference "NoteComment.count", 1 do | ||
post api_notes_path(:lat => -1.0, :lon => -1.0, :text => "This is a comment", :format => "json") | ||
assert_no_difference "NoteSubscription.count" do | ||
post api_notes_path(:lat => -1.0, :lon => -1.0, :text => "This is a comment", :format => "json") | ||
end | ||
end | ||
end | ||
assert_response :success | ||
|
@@ -135,7 +137,7 @@ def test_create_success | |
assert_nil js["properties"]["comments"].last["user"] | ||
end | ||
|
||
def test_create_fail | ||
def test_create_anonymous_fail | ||
assert_no_difference "Note.count" do | ||
assert_no_difference "NoteComment.count" do | ||
post api_notes_path(:lon => -1.0, :text => "This is a comment") | ||
|
@@ -200,14 +202,44 @@ def test_create_fail | |
assert_response :bad_request | ||
end | ||
|
||
def test_create_success | ||
user = create(:user) | ||
auth_header = bearer_authorization_header user | ||
assert_difference "Note.count", 1 do | ||
assert_difference "NoteComment.count", 1 do | ||
assert_difference "NoteSubscription.count", 1 do | ||
post api_notes_path(:lat => -1.0, :lon => -1.0, :text => "This is a comment", :format => "json"), :headers => auth_header | ||
end | ||
end | ||
end | ||
assert_response :success | ||
js = ActiveSupport::JSON.decode(@response.body) | ||
assert_not_nil js | ||
assert_equal "Feature", js["type"] | ||
assert_equal "Point", js["geometry"]["type"] | ||
assert_equal [-1.0, -1.0], js["geometry"]["coordinates"] | ||
assert_equal "open", js["properties"]["status"] | ||
assert_equal 1, js["properties"]["comments"].count | ||
assert_equal "opened", js["properties"]["comments"].last["action"] | ||
assert_equal "This is a comment", js["properties"]["comments"].last["text"] | ||
assert_equal user.display_name, js["properties"]["comments"].last["user"] | ||
|
||
note = Note.last | ||
subscription = NoteSubscription.last | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This (and all the other similar versions in other tests) is relying on nothing else having created notes or users in a way that overlaps this test and I'm not sure how safe that is when tests are running in parallel? Maybe it would be better to get the node ID from the JSON response and then do There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Parallel tests are run in separate databases (e.g. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There is a check
Other tests in this file or other tests elsewhere? You can find similar uses of |
||
assert_equal user, subscription.user | ||
assert_equal note, subscription.note | ||
end | ||
|
||
def test_comment_success | ||
open_note_with_comment = create(:note_with_comments) | ||
user = create(:user) | ||
auth_header = bearer_authorization_header user | ||
assert_difference "NoteComment.count", 1 do | ||
assert_no_difference "ActionMailer::Base.deliveries.size" do | ||
perform_enqueued_jobs do | ||
post comment_api_note_path(open_note_with_comment, :text => "This is an additional comment", :format => "json"), :headers => auth_header | ||
assert_difference "NoteSubscription.count", 1 do | ||
assert_no_difference "ActionMailer::Base.deliveries.size" do | ||
perform_enqueued_jobs do | ||
post comment_api_note_path(open_note_with_comment, :text => "This is an additional comment", :format => "json"), :headers => auth_header | ||
end | ||
end | ||
end | ||
end | ||
|
@@ -222,6 +254,10 @@ def test_comment_success | |
assert_equal "This is an additional comment", js["properties"]["comments"].last["text"] | ||
assert_equal user.display_name, js["properties"]["comments"].last["user"] | ||
|
||
subscription = NoteSubscription.last | ||
assert_equal user, subscription.user | ||
assert_equal open_note_with_comment, subscription.note | ||
|
||
get api_note_path(open_note_with_comment, :format => "json") | ||
assert_response :success | ||
js = ActiveSupport::JSON.decode(@response.body) | ||
|
@@ -233,7 +269,9 @@ def test_comment_success | |
assert_equal "commented", js["properties"]["comments"].last["action"] | ||
assert_equal "This is an additional comment", js["properties"]["comments"].last["text"] | ||
assert_equal user.display_name, js["properties"]["comments"].last["user"] | ||
end | ||
|
||
def test_comment_with_notifications_success | ||
# Ensure that emails are sent to users | ||
first_user = create(:user) | ||
second_user = create(:user) | ||
|
@@ -247,9 +285,11 @@ def test_comment_success | |
auth_header = bearer_authorization_header third_user | ||
|
||
assert_difference "NoteComment.count", 1 do | ||
assert_difference "ActionMailer::Base.deliveries.size", 2 do | ||
perform_enqueued_jobs do | ||
post comment_api_note_path(note_with_comments_by_users, :text => "This is an additional comment", :format => "json"), :headers => auth_header | ||
assert_difference "NoteSubscription.count", 1 do | ||
assert_difference "ActionMailer::Base.deliveries.size", 2 do | ||
perform_enqueued_jobs do | ||
post comment_api_note_path(note_with_comments_by_users, :text => "This is an additional comment", :format => "json"), :headers => auth_header | ||
end | ||
end | ||
end | ||
end | ||
|
@@ -264,6 +304,10 @@ def test_comment_success | |
assert_equal "This is an additional comment", js["properties"]["comments"].last["text"] | ||
assert_equal third_user.display_name, js["properties"]["comments"].last["user"] | ||
|
||
subscription = NoteSubscription.last | ||
assert_equal third_user, subscription.user | ||
assert_equal note_with_comments_by_users, subscription.note | ||
|
||
email = ActionMailer::Base.deliveries.find { |e| e.to.first == first_user.email } | ||
assert_not_nil email | ||
assert_equal 1, email.to.length | ||
|
@@ -290,6 +334,43 @@ def test_comment_success | |
ActionMailer::Base.deliveries.clear | ||
end | ||
|
||
def test_comment_twice_success | ||
open_note_with_comment = create(:note_with_comments) | ||
user = create(:user) | ||
auth_header = bearer_authorization_header user | ||
assert_difference "NoteComment.count", 1 do | ||
assert_difference "NoteSubscription.count", 1 do | ||
assert_no_difference "ActionMailer::Base.deliveries.size" do | ||
perform_enqueued_jobs do | ||
post comment_api_note_path(open_note_with_comment, :text => "This is an additional comment", :format => "json"), :headers => auth_header | ||
end | ||
end | ||
end | ||
end | ||
assert_response :success | ||
js = ActiveSupport::JSON.decode(@response.body) | ||
assert_not_nil js | ||
assert_equal 2, js["properties"]["comments"].count | ||
|
||
subscription = NoteSubscription.last | ||
assert_equal user, subscription.user | ||
assert_equal open_note_with_comment, subscription.note | ||
|
||
assert_difference "NoteComment.count", 1 do | ||
assert_no_difference "NoteSubscription.count" do | ||
assert_no_difference "ActionMailer::Base.deliveries.size" do | ||
perform_enqueued_jobs do | ||
post comment_api_note_path(open_note_with_comment, :text => "This is a second additional comment", :format => "json"), :headers => auth_header | ||
end | ||
end | ||
end | ||
end | ||
assert_response :success | ||
js = ActiveSupport::JSON.decode(@response.body) | ||
assert_not_nil js | ||
assert_equal 3, js["properties"]["comments"].count | ||
end | ||
|
||
def test_comment_fail | ||
open_note_with_comment = create(:note_with_comments) | ||
|
||
|
@@ -346,7 +427,9 @@ def test_close_success | |
|
||
auth_header = bearer_authorization_header user | ||
|
||
post close_api_note_path(open_note_with_comment, :text => "This is a close comment", :format => "json"), :headers => auth_header | ||
assert_difference "NoteSubscription.count", 1 do | ||
post close_api_note_path(open_note_with_comment, :text => "This is a close comment", :format => "json"), :headers => auth_header | ||
end | ||
assert_response :success | ||
js = ActiveSupport::JSON.decode(@response.body) | ||
assert_not_nil js | ||
|
@@ -358,6 +441,10 @@ def test_close_success | |
assert_equal "This is a close comment", js["properties"]["comments"].last["text"] | ||
assert_equal user.display_name, js["properties"]["comments"].last["user"] | ||
|
||
subscription = NoteSubscription.last | ||
assert_equal user, subscription.user | ||
assert_equal open_note_with_comment, subscription.note | ||
|
||
get api_note_path(open_note_with_comment.id, :format => "json") | ||
assert_response :success | ||
js = ActiveSupport::JSON.decode(@response.body) | ||
|
@@ -400,7 +487,9 @@ def test_reopen_success | |
|
||
auth_header = bearer_authorization_header user | ||
|
||
post reopen_api_note_path(closed_note_with_comment, :text => "This is a reopen comment", :format => "json"), :headers => auth_header | ||
assert_difference "NoteSubscription.count", 1 do | ||
post reopen_api_note_path(closed_note_with_comment, :text => "This is a reopen comment", :format => "json"), :headers => auth_header | ||
end | ||
assert_response :success | ||
js = ActiveSupport::JSON.decode(@response.body) | ||
assert_not_nil js | ||
|
@@ -412,6 +501,10 @@ def test_reopen_success | |
assert_equal "This is a reopen comment", js["properties"]["comments"].last["text"] | ||
assert_equal user.display_name, js["properties"]["comments"].last["user"] | ||
|
||
subscription = NoteSubscription.last | ||
assert_equal user, subscription.user | ||
assert_equal closed_note_with_comment, subscription.note | ||
|
||
get api_note_path(closed_note_with_comment, :format => "json") | ||
assert_response :success | ||
js = ActiveSupport::JSON.decode(@response.body) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this could be simplified using the association?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That would require one more
&.
afternote__subscriptions
, so it depends on whether you think that chained&.
s are simplifications.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't believe it does - if
current_user
is defined then thenote_subscriptions
association will always exist. It might evaluate to an empty list but the association object will exist and can have methods invoked on it.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Try running Rubocop.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm you're quite right, and rubocop is quite right, which I find quite odd but apparently ruby does continue evaluating the line after the first
&.
fails.Personally I still think I prefer it but it's not a huge issue.