Commit d293b55a authored by Sean McGivern's avatar Sean McGivern

Merge branch 'new-note-worker-record-not-found-fix' into 'master'

Fix record not found error on NewNoteWorker processing

Resolves #22678 

See merge request !6863
parents 788dc3b1 d48d879e
...@@ -7,6 +7,7 @@ class Note < ActiveRecord::Base ...@@ -7,6 +7,7 @@ class Note < ActiveRecord::Base
include Importable include Importable
include FasterCacheKeys include FasterCacheKeys
include CacheMarkdownField include CacheMarkdownField
include AfterCommitQueue
cache_markdown_field :note, pipeline: :note cache_markdown_field :note, pipeline: :note
......
...@@ -26,9 +26,12 @@ module Notes ...@@ -26,9 +26,12 @@ module Notes
note.note = content note.note = content
end end
if !only_commands && note.save note.run_after_commit do
# Finish the harder work in the background # Finish the harder work in the background
NewNoteWorker.perform_in(2.seconds, note.id, params) NewNoteWorker.perform_async(note.id)
end
if !only_commands && note.save
todo_service.new_note(note, current_user) todo_service.new_note(note, current_user)
end end
......
...@@ -2,10 +2,12 @@ class NewNoteWorker ...@@ -2,10 +2,12 @@ class NewNoteWorker
include Sidekiq::Worker include Sidekiq::Worker
include DedicatedSidekiqQueue include DedicatedSidekiqQueue
def perform(note_id, note_params) def perform(note_id)
note = Note.find(note_id) if note = Note.find_by(id: note_id)
NotificationService.new.new_note(note) NotificationService.new.new_note(note)
Notes::PostProcessService.new(note).execute Notes::PostProcessService.new(note).execute
else
Rails.logger.error("NewNoteWorker: couldn't find note with ID=#{note_id}, skipping job")
end
end end
end end
---
title: Fix record not found error on NewNoteWorker processing
merge_request: 6863
author: Oswaldo Ferreira
...@@ -14,12 +14,41 @@ describe Notes::CreateService, services: true do ...@@ -14,12 +14,41 @@ describe Notes::CreateService, services: true do
end end
context "valid params" do context "valid params" do
before do it 'returns a valid note' do
@note = Notes::CreateService.new(project, user, opts).execute note = Notes::CreateService.new(project, user, opts).execute
expect(note).to be_valid
end
it 'returns a persisted note' do
note = Notes::CreateService.new(project, user, opts).execute
expect(note).to be_persisted
end
it 'note has valid content' do
note = Notes::CreateService.new(project, user, opts).execute
expect(note.note).to eq(opts[:note])
end end
it { expect(@note).to be_valid } it 'TodoService#new_note is called' do
it { expect(@note.note).to eq(opts[:note]) } note = build(:note)
allow(project).to receive_message_chain(:notes, :new).with(opts) { note }
expect_any_instance_of(TodoService).to receive(:new_note).with(note, user)
Notes::CreateService.new(project, user, opts).execute
end
it 'enqueues NewNoteWorker' do
note = build(:note, id: 999)
allow(project).to receive_message_chain(:notes, :new).with(opts) { note }
expect(NewNoteWorker).to receive(:perform_async).with(note.id)
Notes::CreateService.new(project, user, opts).execute
end
end end
describe 'note with commands' do describe 'note with commands' do
......
require "spec_helper"
describe NewNoteWorker do
context 'when Note found' do
let(:note) { create(:note) }
it "calls NotificationService#new_note" do
expect_any_instance_of(NotificationService).to receive(:new_note).with(note)
described_class.new.perform(note.id)
end
it "calls Notes::PostProcessService#execute" do
notes_post_process_service = double(Notes::PostProcessService)
allow(Notes::PostProcessService).to receive(:new).with(note) { notes_post_process_service }
expect(notes_post_process_service).to receive(:execute)
described_class.new.perform(note.id)
end
end
context 'when Note not found' do
let(:unexistent_note_id) { 999 }
it 'logs NewNoteWorker process skipping' do
expect(Rails.logger).to receive(:error).
with("NewNoteWorker: couldn't find note with ID=999, skipping job")
described_class.new.perform(unexistent_note_id)
end
it 'does not raise errors' do
expect { described_class.new.perform(unexistent_note_id) }.not_to raise_error
end
it "does not call NotificationService#new_note" do
expect_any_instance_of(NotificationService).not_to receive(:new_note)
described_class.new.perform(unexistent_note_id)
end
it "does not call Notes::PostProcessService#execute" do
expect_any_instance_of(Notes::PostProcessService).not_to receive(:execute)
described_class.new.perform(unexistent_note_id)
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment