From f619178085d0c2729e275fa4f46f9cd981189d3e Mon Sep 17 00:00:00 2001 From: elijah Date: Sun, 29 Dec 2013 19:25:05 -0800 Subject: Return 'provider.json' via a controller, to better be able to control the response headers (in particular, 'X-Minimum-Client-Version'). It must now be placed in config/provider/provider.json --- Gemfile | 2 ++ Gemfile.lock | 4 ++++ app/controllers/static_config_controller.rb | 24 +++++++++++++++++++++ config/defaults.yml | 2 ++ config/routes.rb | 1 + test/files/provider.json | 3 +++ test/functional/static_config_controller_test.rb | 27 ++++++++++++++++++++++++ test/test_helper.rb | 5 +++++ 8 files changed, 68 insertions(+) create mode 100644 app/controllers/static_config_controller.rb create mode 100644 test/files/provider.json create mode 100644 test/functional/static_config_controller_test.rb diff --git a/Gemfile b/Gemfile index e475bad..a608764 100644 --- a/Gemfile +++ b/Gemfile @@ -24,6 +24,8 @@ group :test do gem 'capybara', require: false gem 'launchy' # so save_and_open_page works in integration tests gem 'phantomjs-binaries' + gem 'minitest' + gem 'minitest-stub-const' end # unreleased so far ... but leap_web_certs need it diff --git a/Gemfile.lock b/Gemfile.lock index cc549ee..09d3123 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -166,6 +166,8 @@ GEM metaclass (0.0.1) mime-types (1.25.1) mini_portile (0.5.2) + minitest (4.7.5) + minitest-stub-const (0.1) mocha (0.13.3) metaclass (~> 0.0.1) multi_json (1.8.2) @@ -283,6 +285,8 @@ DEPENDENCIES leap_web_core! leap_web_help! leap_web_users! + minitest + minitest-stub-const mocha (~> 0.13.0) phantomjs-binaries poltergeist diff --git a/app/controllers/static_config_controller.rb b/app/controllers/static_config_controller.rb new file mode 100644 index 0000000..c669316 --- /dev/null +++ b/app/controllers/static_config_controller.rb @@ -0,0 +1,24 @@ +# +# This controller is responsible for returning some static config files, such as /provider.json +# +class StaticConfigController < ActionController::Base + + PROVIDER_JSON = File.join(Rails.root, 'config', 'provider', 'provider.json') + + # + # return the provider.json, ensuring that the header X-Minimum-Client-Version is sent + # regardless if a 200 or 304 (not modified) response is sent. + # + def provider + response.headers["X-Minimum-Client-Version"] = APP_CONFIG[:minimum_client_version].to_s + if File.exists?(PROVIDER_JSON) + if stale?(:last_modified => File.mtime(PROVIDER_JSON)) + response.content_type = 'application/json' + render :text => File.read(PROVIDER_JSON) + end + else + render :text => 'not found', :status => 404 + end + end + +end \ No newline at end of file diff --git a/config/defaults.yml b/config/defaults.yml index 98dc334..6e14623 100644 --- a/config/defaults.yml +++ b/config/defaults.yml @@ -48,6 +48,8 @@ common: &common default_locale: :en available_locales: - :en + minimum_client_version: "0.5" + service_levels: &service_levels service_levels: 0: diff --git a/config/routes.rb b/config/routes.rb index 12bfe93..b3e24b9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -6,4 +6,5 @@ LeapWeb::Application.routes.draw do root :to => "home#index" get '(:locale)' => 'home#index', :locale => MATCH_LOCALE, :as => 'home' + get '/provider.json' => 'static_config#provider' end diff --git a/test/files/provider.json b/test/files/provider.json new file mode 100644 index 0000000..7f45293 --- /dev/null +++ b/test/files/provider.json @@ -0,0 +1,3 @@ +{ + "name": "test provider" +} \ No newline at end of file diff --git a/test/functional/static_config_controller_test.rb b/test/functional/static_config_controller_test.rb new file mode 100644 index 0000000..9c2cfef --- /dev/null +++ b/test/functional/static_config_controller_test.rb @@ -0,0 +1,27 @@ +require 'test_helper' + +# use minitest for stubbing, rather than bloated mocha +require 'minitest/stub_const' + +class StaticConfigControllerTest < ActionController::TestCase + + def setup + end + + def test_provider_success + StaticConfigController.stub_const(:PROVIDER_JSON, file_path('provider.json')) do + get :provider, format: :json + assert_equal 'application/json', @response.content_type + assert_response :success + end + end + + def test_provider_not_modified + StaticConfigController.stub_const(:PROVIDER_JSON, file_path('provider.json')) do + request.env["HTTP_IF_MODIFIED_SINCE"] = File.mtime(file_path('provider.json')).rfc2822() + get :provider, format: :json + assert_response 304 + end + end + +end diff --git a/test/test_helper.rb b/test/test_helper.rb index b2f674d..3e301e7 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -9,6 +9,11 @@ Dir["#{File.dirname(__FILE__)}/../*/test/support/**/*.rb"].each { |f| require f class ActiveSupport::TestCase # Add more helper methods to be used by all tests here... + + def file_path(name) + File.join(Rails.root, 'test', 'files', name) + end + end require 'capybara/poltergeist' -- cgit v1.2.3