spec/integration/app_spec.rb in sqs_web-0.0.1 vs spec/integration/app_spec.rb in sqs_web-0.0.2

- old
+ new

@@ -1,369 +1,10 @@ -require 'support/rails_app' -require 'support/fake_sqs' +RSpec.describe "General Application features", :sqs do -Capybara.app = RailsApp - -RSpec.describe "Mounted in Rails Application", :sqs do - - SOURCE_QUEUE_NAME = "TestSourceQueue" - - DLQ_QUEUE_NAME = "TestSourceQueueDLQ" - - let(:sqs) { Aws::SQS::Client.new(region: "us-east-1", credentials: Aws::Credentials.new("fake", "fake")) } - - let(:source_queue_url) { sqs.get_queue_url(queue_name: SOURCE_QUEUE_NAME).queue_url } - - let(:dlq_queue_url) { sqs.get_queue_url(queue_name: DLQ_QUEUE_NAME).queue_url } - - before do - sqs.config.endpoint = $fake_sqs.uri - [SOURCE_QUEUE_NAME, DLQ_QUEUE_NAME].each{|queue_name| sqs.create_queue(queue_name: queue_name)} - dlq_arn = sqs.get_queue_attributes(queue_url: dlq_queue_url).attributes.fetch("QueueArn") - #Set DLQ - sqs.set_queue_attributes( - queue_url: source_queue_url, - attributes: { - "RedrivePolicy" => "{\"deadLetterTargetArn\":\"#{dlq_arn}\",\"maxReceiveCount\":10}" - } - ) - SqsWeb.options[:queues] = [SOURCE_QUEUE_NAME, DLQ_QUEUE_NAME] - end - # basic smoke test all the tabs %w(overview dlq_console).each do |tab| specify "test_#{tab}" do visit "/sqs/#{tab}" expect(page.status_code).to eq 200 end - end - - describe "Overview page" do - it "will show Visible Messages" do - default_messages - - visit "/sqs/overview" - - match_content(page, "#{SOURCE_QUEUE_NAME} 5 0 N/A") - match_content(page, "#{DLQ_QUEUE_NAME} 3 0 #{source_queue_url}") - end - - specify "In Flight Messages" do - default_messages - - receive_messages(source_queue_url, {count: 3}) - receive_messages(dlq_queue_url, {count: 2}) - - visit "/sqs/overview" - - match_content(page, "#{SOURCE_QUEUE_NAME} 2 3 N/A") - match_content(page, "#{DLQ_QUEUE_NAME} 1 2 #{source_queue_url}") - end - - specify "should be default page" do - visit "/sqs" - - expect(current_path).to eq "/sqs/overview" - end - - specify "handle non existent queues" do - SqsWeb.options[:queues] = ["BOGUSQUEUE"] - - visit "/sqs/overview" - - match_content(page, "Aws::SQS::Errors::NonExistentQueue: BOGUSQUEUE") - end - end - - describe "DLQ Console", js: true do - - it "should only show unique entries for each message" do - message_ids = generate_messages(dlq_queue_url, 5).map{|c| c.message_id} - - visit "/sqs/dlq_console" - - message_ids.each{|message_id| expect(page.all("#message_#{message_id}").count).to eq 1} - end - - it "should delete single message" do - messages = generate_messages(dlq_queue_url, 2) - deleted_message_id = messages.pop.message_id - retained_message_id = messages.pop.message_id - - visit "/sqs/dlq_console" - - first("#message_#{deleted_message_id}").hover - - within("#message_#{deleted_message_id}") do - click_on "Remove" - end - - success_message = "Message ID: #{deleted_message_id} in Queue #{DLQ_QUEUE_NAME} was successfully removed." - expect(first("#alert").text).to eq success_message - - expect(page.all("#message_#{deleted_message_id}").count).to eq 0 - expect(page.all("#message_#{retained_message_id}").count).to eq 1 - - visit "/sqs/overview" - - match_content(page, "#{DLQ_QUEUE_NAME} 1 0 #{source_queue_url}") - end - - it "should handle deleting single message that is already deleted" do - deleted_message_id = generate_messages(dlq_queue_url, 1).first.message_id - - visit "/sqs/dlq_console" - - sqs.purge_queue({ queue_url: dlq_queue_url }) - - first("#message_#{deleted_message_id}").hover - - within("#message_#{deleted_message_id}") do - click_on "Remove" - end - - error_message = "Message ID: #{deleted_message_id} in Queue #{DLQ_QUEUE_NAME} has already been deleted or is not visible." - expect(first("#alert").text).to eq error_message - end - - it "should remove multiple selected messages" do - messages = generate_messages(dlq_queue_url, 6) - deleted_message_ids = messages.pop(4).map{|c| c.message_id} - retained_message_ids = messages.pop(2).map{|c| c.message_id} - - visit "/sqs/dlq_console" - - deleted_message_ids.each do |message_id| - first("#batch_action_item_#{message_id}").set(true) - end - - click_on "Bulk Remove" - - expect(first("#alert").text).to eq "Selected messages have been removed successfully." - - deleted_message_ids.each{|message_id| expect(page.all("#message_#{message_id}").count).to eq 0} - retained_message_ids.each{|message_id| expect(page.all("#message_#{message_id}").count).to eq 1} - - visit "/sqs/overview" - - match_content(page, "#{DLQ_QUEUE_NAME} 2 0 #{source_queue_url}") - end - - it "should handle removing multiple selected messages where one or more is already deleted or not visible" do - generate_messages(dlq_queue_url, 3) - - visit "/sqs/dlq_console" - - messages = receive_messages(dlq_queue_url, {count: 3}).messages - sqs.delete_message({queue_url: dlq_queue_url, receipt_handle: messages[2].receipt_handle}) - sqs.change_message_visibility_batch({ - queue_url: dlq_queue_url, - entries: messages.take(2).map do |message| - {id: message.message_id, receipt_handle: message.receipt_handle, visibility_timeout: 0} - end - }) - messages.each do |message| - first("#batch_action_item_#{message.message_id}").set(true) - end - - click_on "Bulk Remove" - - expect(first("#alert").text).to eq "One or more messages may have already been removed or is not visible." - - messages.each{|message| expect(page.all("#message_#{message.message_id}").count).to eq 0} - - visit "/sqs/overview" - - match_content(page, "#{DLQ_QUEUE_NAME} 0 0 #{source_queue_url}") - end - - it "should handle clicking on Bulk Remove without any selection" do - messages = generate_messages(dlq_queue_url, 3) - - visit "/sqs/dlq_console" - - click_on "Bulk Remove" - - expect(first("#alert").text).to eq "" - - messages.each{|message| expect(page.all("#message_#{message.message_id}").count).to eq 1} - end - - it "should render all information related to the visible messages" do - generate_messages(dlq_queue_url, 1) - - visit "/sqs/dlq_console" - - message = receive_messages(dlq_queue_url).messages.first - message.attributes["ApproximateReceiveCount"] = "1" - - message_metadata = <<-EOF - ID #{message.message_id} or Receive Count 1 - Queue Name #{DLQ_QUEUE_NAME} Origin Queue #{source_queue_url} - Message Body Test_0 - EOF - - message_entry = first("#message_#{message.message_id}") - - within(message_entry) do - click_on "Toggle full message" - first(".toggle_format").click - end - - match_content(message_entry, normalize_whitespace(message_metadata)) - match_content(message_entry, normalize_whitespace(message.inspect.to_yaml.split('receipt_handle')[0])) - match_content(message_entry, normalize_whitespace(message.inspect.to_yaml.split('md5', 2)[1])) - match_content(message_entry, normalize_whitespace("Enqueued At #{Time.at(message.attributes["SentTimestamp"].to_i/1000).rfc822}")) - end - - it "should not display any messages that are not in a DLQ" do - generate_messages(source_queue_url, 1) - - visit "/sqs/dlq_console" - - message = receive_messages(source_queue_url).messages.first - - expect(first("#message_#{message.message_id}")).to be_nil - - match_content(page, "Showing 0 visible messages") - end - - it "should be able to move a single message to source queue" do - message_id = generate_messages(dlq_queue_url, 1).first.message_id - - - visit "/sqs/dlq_console" - - first("#message_#{message_id}").hover - - within("#message_#{message_id}") do - click_on "Move to Source Queue" - end - - success_message = "Message ID: #{message_id} in Queue #{DLQ_QUEUE_NAME} was successfully moved to Source Queue #{source_queue_url}." - expect(first("#alert").text).to eq success_message - expect(page.all("#message_#{message_id}").count).to eq 0 - - visit "/sqs/overview" - - match_content(page, "#{SOURCE_QUEUE_NAME} 1 0 N/A") - match_content(page, "#{DLQ_QUEUE_NAME} 0 0 #{source_queue_url}") - - moved_message = receive_messages(source_queue_url).messages.first - expect(moved_message).to_not be_nil - expect(moved_message.body).to eq "Test_0" - expect(moved_message.attributes["ApproximateReceiveCount"]).to eq "1" - expect(moved_message.message_attributes["foo_class"].to_hash).to eq({string_value: "FooWorker", data_type: "String"}) - end - - it "should move multiple selected messages" do - messages = generate_messages(dlq_queue_url, 6) - retained_message_ids = messages.pop(2).map{|c| c.message_id} - moved_message_ids = messages.pop(4).map{|c| c.message_id} - - visit "/sqs/dlq_console" - - moved_message_ids.each do |message_id| - first("#batch_action_item_#{message_id}").set(true) - end - - click_on "Bulk Move to Source Queue" - - expect(first("#alert").text).to eq "Selected messages have been requeued successfully." - - moved_message_ids.each{|message_id| expect(page.all("#message_#{message_id}").count).to eq 0} - retained_message_ids.each{|message_id| expect(page.all("#message_#{message_id}").count).to eq 1} - - visit "/sqs/overview" - - match_content(page, "#{SOURCE_QUEUE_NAME} 4 0 N/A") - match_content(page, "#{DLQ_QUEUE_NAME} 2 0 #{source_queue_url}") - - moved_messages = receive_messages(source_queue_url, {count: 4}).messages.sort_by{|c| c.body} - moved_messages.each_with_index do |moved_message, index| - expect(moved_message).to_not be_nil - expect(moved_message.body).to match "Test_#{index}" - expect(moved_message.attributes["ApproximateReceiveCount"]).to eq "1" - expect(moved_message.message_attributes["foo_class"].to_hash).to eq({string_value: "FooWorker", data_type: "String"}) - end - end - - it "should handle moving multiple selected messages where one or more is already deleted or not visible" do - generate_messages(dlq_queue_url, 3) - - visit "/sqs/dlq_console" - - messages = receive_messages(dlq_queue_url, {count: 3}).messages - sqs.delete_message({queue_url: dlq_queue_url, receipt_handle: messages[2].receipt_handle}) - sqs.change_message_visibility_batch({ - queue_url: dlq_queue_url, - entries: messages.take(2).map do |message| - {id: message.message_id, receipt_handle: message.receipt_handle, visibility_timeout: 0} - end - }) - messages.each do |message| - first("#batch_action_item_#{message.message_id}").set(true) - end - - click_on "Bulk Move to Source Queue" - - expect(first("#alert").text).to eq "One or more messages may have already been requeued or is not visible." - - messages.each{|message| expect(page.all("#message_#{message.message_id}").count).to eq 0} - - visit "/sqs/overview" - - match_content(page, "#{SOURCE_QUEUE_NAME} 2 0 N/A") - match_content(page, "#{DLQ_QUEUE_NAME} 0 0 #{source_queue_url}") - end - - it "should handle clicking on Bulk Move to Source Queue without any selection" do - messages = generate_messages(dlq_queue_url, 3) - - visit "/sqs/dlq_console" - - click_on "Bulk Move to Source Queue" - - expect(first("#alert").text).to eq "" - - messages.each{|message| expect(page.all("#message_#{message.message_id}").count).to eq 1} - end - - it "should have a select/unselect all function" do - messages = generate_messages(dlq_queue_url, 3) - - visit "/sqs/dlq_console" - - first("#select_all").click - - page.all(".bulk_check").each{|node| expect(node["checked"]).to eq true} - - first("#select_all").click - - page.all(".bulk_check").each{|node| expect(node["checked"]).to eq false} - end - end - - def receive_messages(queue_url, options = {count: 1}) - sqs.receive_message({ - queue_url: queue_url, - attribute_names: ["All"], - message_attribute_names: ["All"], - max_number_of_messages: options[:count], - wait_time_seconds: 1, - visibility_timeout: options[:visibility_timeout] - }) - end - - def default_messages - generate_messages(source_queue_url, 5) + generate_messages(dlq_queue_url, 3) - end - - def generate_messages(queue_url, count=1) - messages = [] - count.times do |time| - messages << sqs.send_message(queue_url: queue_url, message_body: "Test_#{time}", - message_attributes: {"foo_class"=> {string_value: "FooWorker", data_type: "String"}}) - end - messages end end