Skip to content

Commit

Permalink
UnsentDocumentsService ignores missing and closed tickets
Browse files Browse the repository at this point in the history
- service determines ZD instance for ticket based on intake

Co-authored-by: Ben Golder <bgolder@codeforamerica.org>
  • Loading branch information
kayline and bengolder committed Jun 4, 2020
1 parent 78b713f commit cfa1244
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 64 deletions.
38 changes: 20 additions & 18 deletions app/services/unsent_documents_service.rb
Original file line number Diff line number Diff line change
@@ -1,32 +1,34 @@
class UnsentDocumentsService
include ZendeskServiceHelper
include Rails.application.routes.url_helpers

def instance
@instance ||= EitcZendeskInstance
end

def detect_unsent_docs_and_notify
DatadogApi.increment("cronjob.documents.unsent.detect_and_notify")

tickets_updated = 0
Intake.where.not(intake_ticket_id: nil).find_each(batch_size: 100) do |intake|
unsent_docs = intake.documents.where(zendesk_ticket_id: nil).where("created_at < ?", 15.minutes.ago)
if unsent_docs.present?
comment_body = <<~BODY
New client documents are available to view: #{zendesk_ticket_url(id: intake.intake_ticket_id)}
Files uploaded:
#{unsent_docs.map {|d| "* #{d.upload.filename} (#{d.document_type})"}.join("\n")}
BODY
zendesk_service = ZendeskIntakeService.new(intake)

append_comment_to_ticket(
ticket_id: intake.intake_ticket_id,
comment: comment_body
)
unsent_docs.each {|d| d.update(zendesk_ticket_id: intake.intake_ticket_id)}
tickets_updated += 1
DatadogApi.gauge("zendesk.ticket.docs.unsent.ticket_updated.document_count", unsent_docs.length)
ticket = zendesk_service.get_ticket(ticket_id: intake.intake_ticket_id)

if ticket.present? && ticket.status != "closed"
comment_body = <<~BODY
New client documents are available to view: #{zendesk_ticket_url(id: intake.intake_ticket_id)}
Files uploaded:
#{unsent_docs.map {|d| "* #{d.upload.filename} (#{d.document_type})"}.join("\n")}
BODY

zendesk_service.append_comment_to_ticket(
ticket_id: intake.intake_ticket_id,
comment: comment_body
)
unsent_docs.each {|d| d.update(zendesk_ticket_id: intake.intake_ticket_id)}
tickets_updated += 1
DatadogApi.gauge("zendesk.ticket.docs.unsent.ticket_updated.document_count", unsent_docs.length)
end
end
end
DatadogApi.gauge("zendesk.ticket.docs.unsent.tickets_updated", tickets_updated)
DatadogApi.increment("cronjob.documents.unsent.detect_and_notify")
end
end
113 changes: 67 additions & 46 deletions spec/services/unsent_documents_service_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

describe "#detect_unsent_docs_and_notify" do
let(:fake_dogapi) {instance_double(Dogapi::Client, emit_point: nil)}
let(:fake_zendesk_service) {instance_double(ZendeskIntakeService)}
let!(:intake_docs_sent) {create :intake, intake_ticket_id: 1}
let!(:intake_docs_not_sent) {create :intake, intake_ticket_id: 2}
let!(:intake_new_doc) {create :intake, intake_ticket_id: 3}
Expand All @@ -14,7 +15,10 @@
let!(:document4) {create :document, :with_upload, intake: intake_new_doc, zendesk_ticket_id: nil, created_at: 3.minutes.ago}

before do
allow(service).to receive(:append_comment_to_ticket)
allow(ZendeskIntakeService).to receive(:new).and_return(fake_zendesk_service)
allow(fake_zendesk_service).to receive(:append_comment_to_ticket)
allow(fake_zendesk_service).to receive(:get_ticket).and_return(fake_ticket)


DatadogApi.configure do |c|
c.enabled = true
Expand All @@ -27,56 +31,73 @@
DatadogApi.instance_variable_set("@dogapi_client", nil)
end

it "checks each intake for unsent documents and notifies Zendesk if any are found" do
service.detect_unsent_docs_and_notify

comment = <<~BODY
New client documents are available to view: #{zendesk_ticket_url(id: intake_docs_not_sent.intake_ticket_id)}
Files uploaded:
* picture_id.jpg (W-2)
* picture_id.jpg (W-2)
BODY

expect(service).to have_received(:append_comment_to_ticket).with(
ticket_id: intake_docs_not_sent.intake_ticket_id,
comment: comment
)

comment_not_sent = <<~BODY
New client documents are available to view: #{zendesk_ticket_url(id: intake_docs_sent.intake_ticket_id)}
Files uploaded:
* picture_id.jpg (W-2)
BODY

expect(service).not_to have_received(:append_comment_to_ticket).with(
ticket_id: intake_docs_sent.intake_ticket_id,
comment: comment_not_sent
)

expect(document2.reload.zendesk_ticket_id).to eq intake_docs_not_sent.intake_ticket_id
expect(document3.reload.zendesk_ticket_id).to eq intake_docs_not_sent.intake_ticket_id

expect(Dogapi::Client).to have_received(:new).once
expect(fake_dogapi).to have_received(:emit_point).once.with('test.dogapi.cronjob.documents.unsent.detect_and_notify', 1, {:tags => ["env:" + Rails.env], :type => "count"})
expect(fake_dogapi).to have_received(:emit_point).once.with('test.dogapi.zendesk.ticket.docs.unsent.tickets_updated', 1, {:tags => ["env:" + Rails.env], :type => "gauge"})
expect(fake_dogapi).to have_received(:emit_point).once.with('test.dogapi.zendesk.ticket.docs.unsent.ticket_updated.document_count', 2, {:tags => ["env:" + Rails.env], :type => "gauge"})
context "when the ticket is not closed" do
let(:fake_ticket) {double(:ticket, status: "open")}

it "checks each intake for unsent documents and notifies Zendesk if any are found" do
service.detect_unsent_docs_and_notify

comment = <<~BODY
New client documents are available to view: #{zendesk_ticket_url(id: intake_docs_not_sent.intake_ticket_id)}
Files uploaded:
* picture_id.jpg (W-2)
* picture_id.jpg (W-2)
BODY

expect(fake_zendesk_service).to have_received(:append_comment_to_ticket).with(
ticket_id: intake_docs_not_sent.intake_ticket_id,
comment: comment
)

comment_not_sent = <<~BODY
New client documents are available to view: #{zendesk_ticket_url(id: intake_docs_sent.intake_ticket_id)}
Files uploaded:
* picture_id.jpg (W-2)
BODY

expect(fake_zendesk_service).not_to have_received(:append_comment_to_ticket).with(
ticket_id: intake_docs_sent.intake_ticket_id,
comment: comment_not_sent
)

expect(document2.reload.zendesk_ticket_id).to eq intake_docs_not_sent.intake_ticket_id
expect(document3.reload.zendesk_ticket_id).to eq intake_docs_not_sent.intake_ticket_id

expect(Dogapi::Client).to have_received(:new).once
expect(fake_dogapi).to have_received(:emit_point).once.with('test.dogapi.cronjob.documents.unsent.detect_and_notify', 1, {:tags => ["env:" + Rails.env], :type => "count"})
expect(fake_dogapi).to have_received(:emit_point).once.with('test.dogapi.zendesk.ticket.docs.unsent.tickets_updated', 1, {:tags => ["env:" + Rails.env], :type => "gauge"})
expect(fake_dogapi).to have_received(:emit_point).once.with('test.dogapi.zendesk.ticket.docs.unsent.ticket_updated.document_count', 2, {:tags => ["env:" + Rails.env], :type => "gauge"})
end

it "does not notify about or update unsent docs that are less than 15 minutes old" do
service.detect_unsent_docs_and_notify

comment_not_sent = <<~BODY
New client documents are available to view: #{zendesk_ticket_url(id: intake_new_doc.intake_ticket_id)}
Files uploaded:
* picture_id.jpg (W-2)
BODY

expect(fake_zendesk_service).not_to have_received(:append_comment_to_ticket).with(
ticket_id: intake_new_doc.intake_ticket_id,
comment: comment_not_sent
)

expect(document4.reload.zendesk_ticket_id).to be_nil
end
end

it "does not notify about or update unsent docs that are less than 15 minutes old" do
service.detect_unsent_docs_and_notify
context "when the ticket is closed" do
let(:fake_ticket) {double(:ticket, status: "closed")}

comment_not_sent = <<~BODY
New client documents are available to view: #{zendesk_ticket_url(id: intake_new_doc.intake_ticket_id)}
Files uploaded:
* picture_id.jpg (W-2)
BODY
it "does not append a comment or update the documents" do
service.detect_unsent_docs_and_notify

expect(service).not_to have_received(:append_comment_to_ticket).with(
ticket_id: intake_new_doc.intake_ticket_id,
comment: comment_not_sent
)
expect(fake_zendesk_service).not_to have_received(:append_comment_to_ticket)

expect(document4.reload.zendesk_ticket_id).to be_nil
expect(document2.reload.zendesk_ticket_id).to be_nil
expect(document3.reload.zendesk_ticket_id).to be_nil
end
end
end
end

0 comments on commit cfa1244

Please sign in to comment.