require 'test/unit' require 'rubygems' require 'mocha' require 'shoulda' require 'webmock/test_unit' require File.expand_path('../../lib/prowler', __FILE__) class FakeLogger def info(*args); end def debug(*args); end def warn(*args); end def error(*args); end def fatal(*args); end end RAILS_ROOT = File.dirname(__FILE__) RAILS_DEFAULT_LOGGER = FakeLogger.new class ProwlerTest < Test::Unit::TestCase context "Prowler configuration" do setup do Prowler.reset_configuration end should "be done with a block" do Prowler.configure do |config| config.service_url = "test.host" config.api_key = "apikey" config.application = "application" config.provider_key = "providerkey" end assert_equal "test.host", Prowler.service_url assert_equal "apikey", Prowler.api_key assert_equal "application", Prowler.application assert_equal "providerkey", Prowler.provider_key end should "not set a default application" do assert_equal nil, Prowler.application end should "not set a default API key" do assert_equal nil, Prowler.api_key end context "when using an instance" do setup do Prowler.reset_configuration Prowler.configure do |config| config.api_key = "apikey" config.application = "application" config.provider_key = "providerkey" end end should "inheirit config from global scope" do prowler = Prowler.new assert_equal "apikey", prowler.api_key assert_equal "application", prowler.application assert_equal "providerkey", prowler.provider_key end should "override application config" do prowler = Prowler.new(:application => "application2") assert_equal "application2", prowler.application end should "override provider_key config" do prowler = Prowler.new(:provider_key => "providerkey2") assert_equal "providerkey2", prowler.provider_key end should "override api_key config" do prowler = Prowler.new(:api_key => "apikey2") assert_equal "apikey2", prowler.api_key end end end context "Sending a notification" do setup do Prowler.reset_configuration Prowler.configure do |config| config.api_key = "apikey" config.application = "Application Name" end end should "raise an exception if API key not configured" do Prowler.reset_configuration assert_raises Prowler::ConfigurationError do Prowler.notify "Event", "Description" end prowler = Prowler.new(nil, nil) assert_raises Prowler::ConfigurationError do prowler.notify "Event", "Description" end end should "raise an exception if application not configured" do Prowler.reset_configuration Prowler.configure do |config| config.api_key = "apikey" end assert_raises Prowler::ConfigurationError do Prowler.notify "Event", "Description" end prowler = Prowler.new("apikey", nil) assert_raises Prowler::ConfigurationError do prowler.notify "Event", "Description" end end should "verify SSL certificates by default" do Net::HTTP.any_instance.expects(:use_ssl=).with(true) Net::HTTP.any_instance.expects(:verify_mode=).with(OpenSSL::SSL::VERIFY_PEER) Net::HTTP.any_instance.expects(:ca_file=).with(File.expand_path('config/cacert.pem', RAILS_ROOT)) Prowler.send_notifications = false Prowler.notify "Event Name", "Message Text" end should "not verify SSL certificates if verification is turned off" do Net::HTTP.any_instance.expects(:use_ssl=).with(true) Net::HTTP.any_instance.expects(:verify_mode=).with(OpenSSL::SSL::VERIFY_NONE) Prowler.send_notifications = false Prowler.verify_certificate = false Prowler.notify "Event Name", "Message Text" end should "not send notifications if send_notifications is false" do stub_request(:post, "#{Prowler::SERVICE_URL}/add") Prowler.send_notifications = false Prowler.notify "Event Name", "Message Text" assert_not_requested :post, "#{Prowler::SERVICE_URL}/add" end should "send multiple API keys if configured" do stub_request :post, "#{Prowler::SERVICE_URL}/add" Prowler.api_key = %w(apikey1 apikey2) Prowler.notify "Event Name", "Message Text" assert_requested :post, "#{Prowler::SERVICE_URL}/add", :body => { :application => "Application Name", :apikey => "apikey1,apikey2", :event => "Event Name", :description => "Message Text", :priority => Prowler::Priority::NORMAL.to_s } end should "log a successful response" do stub_request(:post, "#{Prowler::SERVICE_URL}/add") Prowler.logger.expects(:info).with("Prowl Success: Net::HTTPOK") Prowler.notify "Event Name", "Message Text" assert_requested :post, "#{Prowler::SERVICE_URL}/add", :body => { :application => "Application Name", :apikey => "apikey", :event => "Event Name", :description => "Message Text", :priority => Prowler::Priority::NORMAL.to_s } end should "log an error response" do stub_request(:post, "#{Prowler::SERVICE_URL}/add"). to_return(:status => 500, :headers => {}, :body => "") Prowler.logger.expects(:error).with("Prowl Failure: Net::HTTPInternalServerError") Prowler.notify "Event Name", "Message Text" assert_requested :post, "#{Prowler::SERVICE_URL}/add", :body => { :application => "Application Name", :apikey => "apikey", :event => "Event Name", :description => "Message Text", :priority => Prowler::Priority::NORMAL.to_s } end should "delay sending if configured globally" do Prowler::Application.any_instance.expects(:enqueue_delayed_job).with( :application => "Application Name", :providerkey => nil, :apikey => "apikey", :event => "Event Name", :description => "Message Text", :priority => Prowler::Priority::NORMAL ) Prowler.delayed = true Prowler.notify "Event Name", "Message Text" end should "delay sending using options" do Prowler::Application.any_instance.expects(:enqueue_delayed_job).with( :application => "Application Name", :providerkey => nil, :apikey => "apikey", :event => "Event Name", :description => "Message Text", :priority => Prowler::Priority::NORMAL ) Prowler.delayed = false Prowler.notify "Event Name", "Message Text", :delayed => true end should "send a custom url" do stub_request(:post, "#{Prowler::SERVICE_URL}/add") Prowler.notify "Event Name", "Message Text", :url => "http://www.pixeltrix.co.uk" assert_requested :post, "#{Prowler::SERVICE_URL}/add", :body => { :application => "Application Name", :apikey => "apikey", :event => "Event Name", :description => "Message Text", :priority => Prowler::Priority::NORMAL.to_s, :url => "http://www.pixeltrix.co.uk" } end should "send with a high priority using options" do stub_request(:post, "#{Prowler::SERVICE_URL}/add") Prowler.notify "Event Name", "Message Text", :priority => Prowler::Priority::HIGH assert_requested :post, "#{Prowler::SERVICE_URL}/add", :body => { :application => "Application Name", :apikey => "apikey", :event => "Event Name", :description => "Message Text", :priority => Prowler::Priority::HIGH.to_s } end should "send the provider key if configured" do stub_request(:post, "#{Prowler::SERVICE_URL}/add") Prowler.provider_key = "providerkey" Prowler.notify "Event Name", "Message Text" assert_requested :post, "#{Prowler::SERVICE_URL}/add", :body => { :application => "Application Name", :providerkey => "providerkey", :apikey => "apikey", :event => "Event Name", :description => "Message Text", :priority => Prowler::Priority::NORMAL.to_s } end should "allow passing the API key as a parameter" do stub_request(:post, "#{Prowler::SERVICE_URL}/add") Prowler.notify "Event Name", "Message Text", "apikey1" assert_requested :post, "#{Prowler::SERVICE_URL}/add", :body => { :application => "Application Name", :apikey => "apikey1", :event => "Event Name", :description => "Message Text", :priority => Prowler::Priority::NORMAL.to_s } end should "allow passing multiple API keys as a parameter" do stub_request(:post, "#{Prowler::SERVICE_URL}/add") Prowler.notify "Event Name", "Message Text", %w[apikey1 apikey2] assert_requested :post, "#{Prowler::SERVICE_URL}/add", :body => { :application => "Application Name", :apikey => "apikey1,apikey2", :event => "Event Name", :description => "Message Text", :priority => Prowler::Priority::NORMAL.to_s } end context "when raise_errors is true" do should "raise an exception if the Prowl API returns an error" do stub_request(:post, "#{Prowler::SERVICE_URL}/add"). to_return(:status => 500, :headers => {}, :body => <<-EOF Internal Server Error EOF ) assert_raises(Prowler::Error) do Prowler.raise_errors = true Prowler.notify "Event Name", "Message Text" end end end context "when raise_errors is false" do should "not raise an exception if the the Prowl API returns an error" do stub_request(:post, "#{Prowler::SERVICE_URL}/add"). to_return(:status => 500, :headers => {}, :body => <<-EOF Internal Server Error EOF ) assert_nothing_raised do Prowler.raise_errors = false Prowler.notify "Event Name", "Message Text" end end end end context "Verifying an API key" do setup do Prowler.reset_configuration Prowler.configure do |config| config.api_key = "apikey" config.application = "Application Name" end end should "raise an exception if API key not configured" do Prowler.reset_configuration assert_raises Prowler::ConfigurationError do Prowler.verify end prowler = Prowler.new(nil, nil) assert_raises Prowler::ConfigurationError do Prowler.verify end end should "only verify the first API key" do stub_request :get, "#{Prowler::SERVICE_URL}/verify?apikey=apikey1" Prowler.api_key = %w(apikey1 apikey2) Prowler.verify assert_requested :get, "#{Prowler::SERVICE_URL}/verify?apikey=apikey1" end should "not send notifications if send_notifications is false" do stub_request :get, "#{Prowler::SERVICE_URL}/verify?apikey=apikey" Prowler.send_notifications = false Prowler.verify assert_not_requested :get, "#{Prowler::SERVICE_URL}/verify?apikey=apikey" end should "verify SSL certificates by default" do Net::HTTP.any_instance.expects(:use_ssl=).with(true) Net::HTTP.any_instance.expects(:verify_mode=).with(OpenSSL::SSL::VERIFY_PEER) Net::HTTP.any_instance.expects(:ca_file=).with(File.expand_path('config/cacert.pem', RAILS_ROOT)) Prowler.send_notifications = false Prowler.verify end should "not verify SSL certificates if verification is turned off" do Net::HTTP.any_instance.expects(:use_ssl=).with(true) Net::HTTP.any_instance.expects(:verify_mode=).with(OpenSSL::SSL::VERIFY_NONE) Prowler.send_notifications = false Prowler.verify_certificate = false Prowler.verify end should "send the provider key if configured" do stub_request :get, "#{Prowler::SERVICE_URL}/verify?apikey=apikey&providerkey=providerkey" Prowler.provider_key = "providerkey" Prowler.verify assert_requested :get, "#{Prowler::SERVICE_URL}/verify?apikey=apikey&providerkey=providerkey" end should "allow passing an API key as a parameter" do stub_request :get, "#{Prowler::SERVICE_URL}/verify?apikey=apikey1" Prowler.verify "apikey1" assert_requested :get, "#{Prowler::SERVICE_URL}/verify?apikey=apikey1" end should "only verify the first API key passed as a parameter" do stub_request :get, "#{Prowler::SERVICE_URL}/verify?apikey=apikey1" Prowler.verify %w[apikey1 apikey2] assert_requested :get, "#{Prowler::SERVICE_URL}/verify?apikey=apikey1" end context "when raise_errors is true" do should "raise an exception if the Prowl API returns an error" do stub_request(:get, "#{Prowler::SERVICE_URL}/verify?apikey=apikey"). to_return(:status => 500, :headers => {}, :body => <<-EOF Internal Server Error EOF ) assert_raises(Prowler::Error) do Prowler.raise_errors = true Prowler.verify end end end context "when raise_errors is false" do should "not raise an exception if the the Prowl API returns an error" do stub_request(:get, "#{Prowler::SERVICE_URL}/verify?apikey=apikey"). to_return(:status => 500, :headers => {}, :body => <<-EOF Internal Server Error EOF ) assert_nothing_raised do Prowler.raise_errors = false Prowler.verify end end end end context "Retrieving an API key" do setup do Prowler.reset_configuration Prowler.configure do |config| config.provider_key = "providerkey" end end should "raise an exception if the provider key is not configured" do Prowler.reset_configuration assert_raises Prowler::ConfigurationError do Prowler.retrieve_token end assert_raises Prowler::ConfigurationError do Prowler.retrieve_api_key("token") end end should "request a token and return a Prowler::Token instance when successful" do stub_request(:get, "#{Prowler::SERVICE_URL}/retrieve/token?providerkey=providerkey"). to_return(:status => 200, :headers => {}, :body => <<-EOF EOF ) response = Prowler.retrieve_token assert_requested :get, "#{Prowler::SERVICE_URL}/retrieve/token?providerkey=providerkey" assert_instance_of Prowler::Token, response assert_equal response.remaining, 999 assert_equal response.reset_date, Time.at(1234567890) assert_equal response.token, "token" assert_equal response.url, "https://prowlapp.com/retrieve.php?token=token" end should "request an API key and return a Prowler::ApiKey instance when successful" do stub_request(:get, "#{Prowler::SERVICE_URL}/retrieve/apikey?providerkey=providerkey&token=token"). to_return(:status => 200, :headers => {}, :body => <<-EOF EOF ) response = Prowler.retrieve_api_key("token") assert_requested :get, "#{Prowler::SERVICE_URL}/retrieve/apikey?providerkey=providerkey&token=token" assert_instance_of Prowler::ApiKey, response assert_equal response.remaining, 999 assert_equal response.reset_date, Time.at(1234567890) assert_equal response.api_key, "apikey" end end context "Using deprecated API" do context "Prowler configuration" do setup do Prowler.reset_configuration end should "override class configuration when using an instance" do prowler = Prowler.new("apikey2", "application2", "providerkey2") assert_equal "apikey2", prowler.api_key assert_equal "application2", prowler.application assert_equal "providerkey2", prowler.provider_key end should "configure default service url" do prowler = Prowler.new("apikey", "application") assert_equal Prowler::SERVICE_URL, prowler.service_url end end context "Sending a notification" do setup do Prowler.reset_configuration Prowler.configure do |config| config.api_key = "apikey" config.application = "Application Name" end end should "delay sending using parameter" do Prowler::Application.any_instance.expects(:enqueue_delayed_job).with( :application => "Application Name", :providerkey => nil, :apikey => "apikey", :event => "Event Name", :description => "Message Text", :priority => Prowler::Priority::NORMAL ) Prowler.delayed = false Prowler.notify "Event Name", "Message Text", Prowler::Priority::NORMAL, true end should "send with a high priority using parameter" do stub_request(:post, "#{Prowler::SERVICE_URL}/add") Prowler.notify "Event Name", "Message Text", Prowler::Priority::HIGH assert_requested :post, "#{Prowler::SERVICE_URL}/add", :body => { :application => "Application Name", :apikey => "apikey", :event => "Event Name", :description => "Message Text", :priority => Prowler::Priority::HIGH.to_s } end end end context "When using a custom service url" do setup do Prowler.reset_configuration Prowler.configure do |config| config.service_url = "https://test.host/publicapi" config.api_key = "apikey" config.application = "Application Name" end end should "send notifications to the custom service url" do stub_request(:post, "https://test.host/publicapi/add") Prowler.notify "Event Name", "Message Text" assert_requested :post, "https://test.host/publicapi/add", :body => { :application => "Application Name", :apikey => "apikey", :event => "Event Name", :description => "Message Text", :priority => Prowler::Priority::NORMAL.to_s } end should "verify the API key with the custom url" do stub_request :get, "https://test.host/publicapi/verify?apikey=apikey" Prowler.verify assert_requested :get, "https://test.host/publicapi/verify?apikey=apikey" end end end