ns_settings_ui 1.1.0 → 1.5.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +5 -5
  2. data/Appraisals +1 -1
  3. data/Gemfile +2 -1
  4. data/Jenkinsfile +11 -12
  5. data/README.md +6 -1
  6. data/app/controllers/ns_settings_ui/settings_controller.rb +2 -2
  7. data/app/helpers/ns_settings_ui/application_helper.rb +1 -1
  8. data/app/helpers/ns_settings_ui/settings_helper.rb +16 -0
  9. data/app/models/ns_settings_ui/setting.rb +64 -8
  10. data/app/views/ns_settings_ui/settings/_edit.html.erb +2 -2
  11. data/docker/{ruby-2.1 → ruby-2.5}/Dockerfile +2 -2
  12. data/gemfiles/rails_5.0.gemfile +1 -1
  13. data/gemfiles/rails_5.1.gemfile +8 -0
  14. data/gemfiles/rails_5.2.gemfile +8 -0
  15. data/lib/ns_settings_ui/version.rb +1 -1
  16. data/ns_settings_ui.gemspec +6 -4
  17. data/spec/controllers/ns_settings_ui/settings_controller_spec.rb +15 -6
  18. data/spec/dummy/app/assets/javascripts/application.js +0 -2
  19. data/spec/dummy/app/controllers/home_controller.rb +4 -0
  20. data/spec/dummy/app/views/layouts/application.html.erb +3 -2
  21. data/spec/dummy/config/initializers/ns_settings_ui.rb +1 -1
  22. data/spec/dummy/config/routes.rb +1 -0
  23. data/spec/helpers/ns_settings_ui/application_helper_spec.rb +25 -0
  24. data/spec/models/ns_settings_ui/setting_spec.rb +120 -18
  25. metadata +69 -94
  26. data/bin/rails +0 -13
  27. data/gemfiles/rails_3.2.gemfile +0 -7
  28. data/gemfiles/rails_4.2.gemfile +0 -7
  29. data/test/dummy/README.rdoc +0 -28
  30. data/test/dummy/Rakefile +0 -6
  31. data/test/dummy/app/assets/images/.keep +0 -0
  32. data/test/dummy/app/assets/javascripts/application.js +0 -13
  33. data/test/dummy/app/assets/stylesheets/application.css +0 -15
  34. data/test/dummy/app/controllers/application_controller.rb +0 -5
  35. data/test/dummy/app/controllers/concerns/.keep +0 -0
  36. data/test/dummy/app/helpers/application_helper.rb +0 -2
  37. data/test/dummy/app/mailers/.keep +0 -0
  38. data/test/dummy/app/models/.keep +0 -0
  39. data/test/dummy/app/models/concerns/.keep +0 -0
  40. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  41. data/test/dummy/bin/bundle +0 -3
  42. data/test/dummy/bin/rails +0 -4
  43. data/test/dummy/bin/rake +0 -4
  44. data/test/dummy/config.ru +0 -4
  45. data/test/dummy/config/application.rb +0 -22
  46. data/test/dummy/config/boot.rb +0 -5
  47. data/test/dummy/config/database.yml +0 -25
  48. data/test/dummy/config/environment.rb +0 -5
  49. data/test/dummy/config/environments/development.rb +0 -37
  50. data/test/dummy/config/environments/production.rb +0 -78
  51. data/test/dummy/config/environments/test.rb +0 -39
  52. data/test/dummy/config/initializers/assets.rb +0 -8
  53. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  54. data/test/dummy/config/initializers/cookies_serializer.rb +0 -3
  55. data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  56. data/test/dummy/config/initializers/inflections.rb +0 -16
  57. data/test/dummy/config/initializers/mime_types.rb +0 -4
  58. data/test/dummy/config/initializers/session_store.rb +0 -3
  59. data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  60. data/test/dummy/config/locales/en.yml +0 -23
  61. data/test/dummy/config/routes.rb +0 -3
  62. data/test/dummy/config/secrets.yml +0 -22
  63. data/test/dummy/lib/assets/.keep +0 -0
  64. data/test/dummy/log/.keep +0 -0
  65. data/test/dummy/public/404.html +0 -67
  66. data/test/dummy/public/422.html +0 -67
  67. data/test/dummy/public/500.html +0 -66
  68. data/test/dummy/public/favicon.ico +0 -0
  69. data/test/integration/navigation_test.rb +0 -9
  70. data/test/ns_settings_ui_test.rb +0 -7
  71. data/test/test_helper.rb +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: b8665dab191f28ece8eadccaead286f6fa658b79
4
- data.tar.gz: 11e8c4de46aabde8b97c84a2c21866a2d53856ab
2
+ SHA256:
3
+ metadata.gz: 02b49482fb2f7c31768dbe484b83e7fd0c781b28bd36fdf44bd9d143a8e7bb58
4
+ data.tar.gz: 47aebdc2fc7252481962e92310ff14c63f55d4b7830579748f213270ce2ad9a6
5
5
  SHA512:
6
- metadata.gz: b1fe0313149eee0848529967798160389128c1e4712a7f001e20f00d18b74d7ccdbadd379e66f92ba122b625d233807f0437cfccb3c968fab68cd167eec6dad7
7
- data.tar.gz: adec6c717e103a95ecd0d92a68683d8a0510b8e352dd7b82fae295315bdefc84a15b77814b7f964f21c8d18b1dd4d4afa932650aea621f316aca6e21416c8a93
6
+ metadata.gz: 95e9fcfbca788664f6c5cd8ca525379bd239add0daec59b25d6cda5550061f5232918391c503c3930d27327bf30f8b6289159c4bc8155d7715918bac08ba3936
7
+ data.tar.gz: ddc46185a5c57a8f7e04ce1ecc79cb63f379ce15e0c6efb6c4816b5231ad9b8de52a36d494f4e6e09f4b20c4b8c873e4859de1c88c60e022816c73631bdc8b64
data/Appraisals CHANGED
@@ -1,4 +1,4 @@
1
- [5.0, 4.2, 3.2].each do |version|
1
+ [5.0, 5.1, 5.2].each do |version|
2
2
  appraise "rails_#{version}" do
3
3
  gem 'rails', "~> #{version}.0"
4
4
  end
data/Gemfile CHANGED
@@ -13,4 +13,5 @@ gemspec
13
13
  # To use debugger
14
14
  # gem 'debugger'
15
15
 
16
- gem 'rails', '~> 3.2' # assuming Rails 3.2 for jenkins jobs and top level rake tasks
16
+ gem 'rails', '>= 5.0'
17
+ gem "sprockets", "~> 3.7.2"
@@ -33,9 +33,9 @@ def appNode(String rubyVersion) {
33
33
  }
34
34
  }
35
35
 
36
- appNode('ruby-2.1')
37
36
  appNode('ruby-2.2')
38
37
  appNode('ruby-2.3')
38
+ appNode('ruby-2.5')
39
39
 
40
40
  def setupGemsDockerVolume(String rubyVersion, String executorNumber) {
41
41
  stage name: "$rubyVersion - Setup Docker Volume", concurrency: 1
@@ -45,16 +45,19 @@ def setupGemsDockerVolume(String rubyVersion, String executorNumber) {
45
45
  def resolveDependencies(me.knapik.DockerCompose compose, String rubyVersion) {
46
46
  stage "$rubyVersion - Resolve Dependencies"
47
47
  compose.exec('app', "bundle install --quiet")
48
- compose.exec('app', "appraisal install")
48
+ compose.exec('app', "bundle exec appraisal install")
49
+ compose.exec('app', "bundle exec appraisal list > .rails_versions")
49
50
  }
50
51
 
51
52
  def test(me.knapik.DockerCompose compose, String rubyVersion) {
52
- stage "$rubyVersion - Tests"
53
- try {
54
- compose.exec('app', "bundle exec rake app:db:schema:load")
55
- compose.exec('app', "bundle exec rake app:ci:setup:rspec spec")
56
- } finally {
57
- publishTestResults()
53
+ def railsVersions = readFile('.rails_versions').tokenize("\n")
54
+ for (int i = 0; i < railsVersions.size(); ++i) {
55
+ def railsVersion = railsVersions[i]
56
+ if(rubyVersion < 'ruby-2.5' && railsVersion >= 'rails_5.2')
57
+ continue
58
+ stage "$rubyVersion $railsVersion - Tests"
59
+ compose.exec('app', "bundle exec appraisal $railsVersion rake db:schema:load")
60
+ compose.exec('app', "bundle exec appraisal $railsVersion rspec spec")
58
61
  }
59
62
  }
60
63
 
@@ -67,10 +70,6 @@ def checkstyle(me.knapik.DockerCompose compose, String rubyVersion) {
67
70
  }
68
71
  }
69
72
 
70
- def publishTestResults() {
71
- step([$class: 'JUnitResultArchiver', testResults: 'spec/reports/*.xml,test/reports/*.xml'])
72
- }
73
-
74
73
  def publishStyleCheckResults() {
75
74
  step([$class: 'CheckStylePublisher', pattern: 'checkstyle.xml'])
76
75
  }
data/README.md CHANGED
@@ -39,9 +39,14 @@ You can modify NsSettingsUi variables in order to:
39
39
  * `NsSettingsUi.layout` - set a layout from your application
40
40
  * `NsSettingsUi.parent_controller` - choose a controller that NsSettingUi controllers will inherit from
41
41
 
42
+ ## Rails support
43
+ Rails 4.2 since ver 1.1, dropped in 1.5
44
+ Rails 5.0 since ver 1.2
45
+ Rails 5.2 since ver 1.5
46
+
42
47
  ## Testing
48
+ This engine is used by NTTR and socialguide.
43
49
 
44
- This engine is used by NTTR and socialguide, thereby needs to be compatible with both Rails 3.2 and 4.2.
45
50
  It uses [Appraisal](https://github.com/thoughtbot/appraisal) gem with a set up similar to [permitters gem](https://github.com/permitters/permitters) to give you an easy way of testing the code under multiple Rails versions.
46
51
 
47
52
  To bundle install for each appraisal defined:
@@ -1,10 +1,10 @@
1
1
  module NsSettingsUi
2
2
  class SettingsController < NsSettingsUi::ApplicationController
3
3
  layout NsSettingsUi.layout
4
- before_filter :setting_from_id_param, only: [:update, :reset]
4
+ before_action :setting_from_id_param, only: [:update, :reset]
5
5
 
6
6
  def index
7
- @settings = Setting.order('`key`').all
7
+ @settings = Setting.order(Arel.sql('`key`')).all
8
8
  end
9
9
 
10
10
  def update
@@ -2,7 +2,7 @@ module NsSettingsUi
2
2
  module ApplicationHelper
3
3
  def url_for(options)
4
4
  super(options)
5
- rescue ActionController::RoutingError
5
+ rescue ActionController::RoutingError, ActionController::UrlGenerationError
6
6
  main_app.url_for(options)
7
7
  end
8
8
 
@@ -6,8 +6,24 @@ module NsSettingsUi
6
6
  ''
7
7
  end
8
8
 
9
+ def render_value_field(form, setting)
10
+ render_field(form, setting.value_type, :value, setting_value_class(setting))
11
+ end
12
+
13
+ def render_default_value_field(form, setting)
14
+ render_field(form, setting.value_type, :default_value)
15
+ end
16
+
9
17
  private
10
18
 
19
+ def render_field(form, value_type, name, additional_class = '')
20
+ if [NsSettingsUi::Setting::TYPES[:boolean], NsSettingsUi::Setting::TYPES[:nullable_boolean]].include?(value_type)
21
+ form.select(name, [[:true, 'true'], [:false, 'false']], include_blank: true)
22
+ else
23
+ form.text_field(name, size: 10, class: "form-control #{additional_class}")
24
+ end
25
+ end
26
+
11
27
  def recursive_hash
12
28
  Hash.new { |hash, key| hash[key] = recursive_hash }
13
29
  end
@@ -2,9 +2,37 @@ module NsSettingsUi
2
2
  class Setting < ActiveRecord::Base
3
3
  TYPES = {
4
4
  string: 1,
5
- integer: 2
5
+ integer: 2,
6
+ boolean: 3,
7
+ date: 7,
8
+ nullable_string: 4,
9
+ nullable_integer: 5,
10
+ nullable_boolean: 6
6
11
  }.freeze
7
12
 
13
+ TYPE_HANDLERS = {
14
+ 1 => :string_value,
15
+ 2 => :integer_value,
16
+ 3 => :boolean_value,
17
+ 7 => :date_value,
18
+ 4 => :nullable_string,
19
+ 5 => :nullable_integer,
20
+ 6 => :nullable_boolean
21
+ }.freeze
22
+
23
+ NULL_VALUES = [nil, ''].freeze
24
+
25
+ # TODO: in Nttr
26
+ # belongs_to :country
27
+ #
28
+ # def self.get(country, *keys)
29
+ # where(country: country, key: keys.join('.')).first_or_create
30
+ # end
31
+ #
32
+ # def country_code
33
+ # country.try(:alpha2).to_s
34
+ # end
35
+
8
36
  def self.get(*keys)
9
37
  where(key: keys.join('.')).first_or_create
10
38
  end
@@ -14,13 +42,41 @@ module NsSettingsUi
14
42
  end
15
43
 
16
44
  def formatted_value
17
- return nil if value.nil?
18
- case value_type
19
- when TYPES[:string] then value.to_s
20
- when TYPES[:integer] then value.to_i
21
- else
22
- value
23
- end
45
+ TYPE_HANDLERS[value_type] ? send(TYPE_HANDLERS[value_type]) : value
46
+ end
47
+
48
+ private
49
+
50
+ def nullify?
51
+ NULL_VALUES.include?(value)
52
+ end
53
+
54
+ def nullable_string
55
+ string_value unless nullify?
56
+ end
57
+
58
+ def nullable_integer
59
+ integer_value unless nullify?
60
+ end
61
+
62
+ def nullable_boolean
63
+ boolean_value unless nullify?
64
+ end
65
+
66
+ def string_value
67
+ value.to_s
68
+ end
69
+
70
+ def integer_value
71
+ value.to_i
72
+ end
73
+
74
+ def boolean_value
75
+ value == 'true'
76
+ end
77
+
78
+ def date_value
79
+ Date.parse(value)
24
80
  end
25
81
  end
26
82
  end
@@ -1,9 +1,9 @@
1
1
  <div id="setting_<%= setting.id -%>">
2
2
  <%= form_for(setting, url: ns_settings_ui.setting_path(setting), method: :put, remote: true, html: {class: 'form-inline'}) do |f| %>
3
3
  <%= f.label(:value) %>
4
- <%= f.text_field(:value, size: 10, class: "form-control #{setting_value_class(setting)}" ) %>
4
+ <%= render_value_field(f, setting) %>
5
5
  <%= f.label(:default_value) %>
6
- <%= f.text_field(:default_value, size: 10, class: 'form-control') %>
6
+ <%= render_default_value_field(f, setting) %>
7
7
  <%= f.submit('Update', class: 'btn btn-default') %>
8
8
  <% end %>
9
9
  <%= form_for(setting, url: ns_settings_ui.reset_setting_path(setting), method: :put, remote: true) do |f| %>
@@ -1,5 +1,5 @@
1
- FROM ruby:2.1
2
- MAINTAINER Michał Knapik <michal.knapik@u2i.com>
1
+ FROM ruby:2.5
2
+ MAINTAINER u2i <hello@u2i.com>
3
3
 
4
4
  RUN wget --quiet --output-document=dumb-init.deb \
5
5
  https://github.com/Yelp/dumb-init/releases/download/v1.1.3/dumb-init_1.1.3_amd64.deb && \
@@ -5,4 +5,4 @@ source "https://rubygems.org"
5
5
  gem "rails", "~> 5.0.0"
6
6
  gem "rails-controller-testing"
7
7
 
8
- gemspec :path => "../"
8
+ gemspec path: "../"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 5.1.0"
6
+ gem "rails-controller-testing"
7
+
8
+ gemspec path: "../"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 5.2.0"
6
+ gem "rails-controller-testing"
7
+
8
+ gemspec path: "../"
@@ -1,3 +1,3 @@
1
1
  module NsSettingsUi
2
- VERSION = '1.1.0'.freeze
2
+ VERSION = '1.5.2'.freeze
3
3
  end
@@ -18,20 +18,22 @@ Gem::Specification.new do |s|
18
18
  s.files = `git ls-files -z`.split("\x0")
19
19
  s.test_files = Dir['spec/**/*']
20
20
 
21
- s.add_dependency 'rails', '>= 3.2.18', '< 6'
21
+ s.add_dependency 'rails', '>= 5.0', '< 6'
22
22
 
23
23
  s.add_development_dependency 'appraisal', '~> 2.1'
24
- s.add_development_dependency 'sqlite3', '~> 1.3'
24
+ s.add_development_dependency 'sqlite3', '~> 1.3.0'
25
25
  s.add_development_dependency 'rspec', '~> 3.4'
26
26
  s.add_development_dependency 'rspec-rails', '~> 3.4'
27
27
  s.add_development_dependency 'rspec-its', '~> 1.2'
28
28
  s.add_development_dependency 'machinist', '~> 2.0'
29
29
  s.add_development_dependency 'database_cleaner', '~> 1.5'
30
30
  s.add_development_dependency 'u2i-ci_utils', '~> 2.0'
31
- s.add_development_dependency 'bundler', '~> 1.5'
32
- s.add_development_dependency 'rake', '~> 11.1'
31
+ s.add_development_dependency 'bundler', '> 1.5'
32
+ s.add_development_dependency 'rake', '~> 12.3.3'
33
33
  s.add_development_dependency 'test-unit', '~> 3.1'
34
34
  s.add_development_dependency 'rubocop-rspec', '~> 1.4.0'
35
+ s.add_development_dependency 'sass', '~> 3.4'
36
+ s.add_development_dependency 'rails-controller-testing'
35
37
 
36
38
  s.add_development_dependency 'guard', '~> 2.13'
37
39
  s.add_development_dependency 'guard-rspec', '~> 4.6'
@@ -5,11 +5,17 @@ RSpec.describe NsSettingsUi::SettingsController, type: :controller do
5
5
 
6
6
  describe 'GET index' do
7
7
  let!(:settings) { Array.new(8) { NsSettingsUi::Setting.make! }.sort_by(&:key) }
8
+ subject { get :index }
8
9
 
9
10
  it 'assigns all settings' do
10
- get :index
11
+ subject
11
12
  expect(assigns(:settings)).to eq(settings)
12
13
  end
14
+
15
+ context 'with views' do
16
+ render_views
17
+ it { is_expected.to be_success }
18
+ end
13
19
  end
14
20
 
15
21
  shared_examples_for 'sets setting and renders update' do
@@ -28,8 +34,9 @@ RSpec.describe NsSettingsUi::SettingsController, type: :controller do
28
34
 
29
35
  describe 'PUT reset' do
30
36
  let(:setting) { NsSettingsUi::Setting.make!(value: 'a', default_value: 'b') }
37
+ let(:params) { {id: setting.id, format: :js} }
31
38
 
32
- before { get :reset, id: setting.id, format: :js }
39
+ before { get :reset, params: params }
33
40
 
34
41
  it 'resets setting value to the default value' do
35
42
  expect(assigns(:setting).value).to eq(setting.default_value)
@@ -40,16 +47,18 @@ RSpec.describe NsSettingsUi::SettingsController, type: :controller do
40
47
 
41
48
  describe 'PUT update' do
42
49
  let(:setting) { NsSettingsUi::Setting.make! }
43
- let(:params) { {value: '5', default_value: '6', key: 'matching.cluster_size'} }
50
+ let(:setting_params) { {value: '5', default_value: '6', key: 'matching.cluster_size'} }
51
+ let(:params) { {id: setting.id, setting: setting_params, format: :js} }
52
+
44
53
 
45
- before { put :update, id: setting.id, setting: params, format: :js }
54
+ before { put :update, params: params }
46
55
 
47
56
  it 'updates value' do
48
- expect(assigns(:setting).value).to eq(params[:value])
57
+ expect(assigns(:setting).value).to eq(setting_params[:value])
49
58
  end
50
59
 
51
60
  it 'updates default value' do
52
- expect(assigns(:setting).default_value).to eq(params[:default_value])
61
+ expect(assigns(:setting).default_value).to eq(setting_params[:default_value])
53
62
  end
54
63
 
55
64
  it 'does not update key' do
@@ -10,6 +10,4 @@
10
10
  // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
11
11
  // GO AFTER THE REQUIRES BELOW.
12
12
  //
13
- //= require jquery
14
- //= require jquery_ujs
15
13
  //= require_tree .
@@ -0,0 +1,4 @@
1
+ class HomeController < ApplicationController
2
+ def index
3
+ end
4
+ end
@@ -2,12 +2,13 @@
2
2
  <html>
3
3
  <head>
4
4
  <title>Dummy</title>
5
- <%= stylesheet_link_tag "application", :media => "all" %>
6
- <%= javascript_include_tag "application" %>
5
+ <%= yield :head -%>
7
6
  <%= csrf_meta_tags %>
8
7
  </head>
9
8
  <body>
10
9
 
10
+ <%= link_to 'Homepage', url_for(controller: '/home', action: :index) -%>
11
+
11
12
  <%= yield %>
12
13
 
13
14
  </body>
@@ -1,4 +1,4 @@
1
1
  if defined?(NsSettingsUi)
2
- NsSettingsUi.layout = nil
2
+ NsSettingsUi.layout = 'application'
3
3
  NsSettingsUi.parent_controller = ActionController::Base
4
4
  end
@@ -1,3 +1,4 @@
1
1
  Rails.application.routes.draw do
2
2
  mount NsSettingsUi::Engine => '/ns_settings_ui'
3
+ get '/home', controller: :home, action: :index
3
4
  end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe NsSettingsUi::ApplicationHelper, type: :helper do
4
+ describe '#url_for' do
5
+ subject { helper.url_for(url_params) }
6
+
7
+ context 'on self route' do
8
+ let(:url_params) { NsSettingsUi::Engine.routes.url_helpers.settings_path }
9
+ it { is_expected.to eq('/ns_settings_ui/settings') }
10
+ end
11
+
12
+ context 'on main application route' do
13
+ let(:url_params) { {controller: '/home'} }
14
+ it { is_expected.to eq('/home') }
15
+ end
16
+
17
+ context 'on incorrect route' do
18
+ let(:url_params) { {controller: 'non-existing-controller', action: 'index'} }
19
+ let(:error_class) do
20
+ Rails::VERSION::MAJOR <= 3 ? ActionController::RoutingError : ActionController::UrlGenerationError
21
+ end
22
+ it { expect { subject }.to raise_error(error_class) }
23
+ end
24
+ end
25
+ end
@@ -53,61 +53,163 @@ RSpec.describe NsSettingsUi::Setting, type: :model do
53
53
  let(:key) { 'aa.bb' }
54
54
  subject { described_class.make(key: key, value: value, value_type: value_type).formatted_value }
55
55
 
56
- context 'when value_type is default' do
57
- let(:value_type) { nil }
58
- context 'when value is a nil' do
59
- let(:value) { nil }
60
- it { is_expected.to be_nil }
61
- end
56
+ shared_examples 'string' do
62
57
  context 'when value is a string' do
63
58
  let(:value) { 'abcd' }
64
59
  it { is_expected.to eq('abcd') }
65
60
  end
61
+
66
62
  context 'when value is an integer with a string' do
67
63
  let(:value) { '4abcd' }
68
64
  it { is_expected.to eq('4abcd') }
69
65
  end
66
+
70
67
  context 'when value is an integer' do
71
68
  let(:value) { '10' }
72
69
  it { is_expected.to eq('10') }
73
70
  end
74
71
  end
75
- context 'when value_type is :string' do
76
- let(:value_type) { NsSettingsUi::Setting::TYPES[:string] }
72
+
73
+ shared_examples 'integer' do
74
+ context 'when value is a string' do
75
+ let(:value) { 'abcd' }
76
+ it { is_expected.to eq(0) }
77
+ end
78
+
79
+ context 'when value is an integer with a string' do
80
+ let(:value) { '4abcd' }
81
+ it { is_expected.to eq(4) }
82
+ end
83
+
84
+ context 'when value is an integer' do
85
+ let(:value) { '10' }
86
+ it { is_expected.to eq(10) }
87
+ end
88
+ end
89
+
90
+ shared_examples 'boolean' do
91
+ context 'when value is true' do
92
+ let(:value) { 'true' }
93
+ it { is_expected.to eq(true) }
94
+ end
95
+
96
+ context 'when value is false' do
97
+ let(:value) { 'false' }
98
+ it { is_expected.to eq(false) }
99
+ end
100
+
101
+ context 'when value is other than true or 1 or false' do
102
+ let(:value) { 'other' }
103
+ it { is_expected.to eq(false) }
104
+ end
105
+ end
106
+
107
+ shared_examples 'nullable_type' do
77
108
  context 'when value is a nil' do
78
109
  let(:value) { nil }
79
110
  it { is_expected.to eq(nil) }
80
111
  end
112
+
113
+ context 'when value is a empty string' do
114
+ let(:value) { '' }
115
+ it { is_expected.to eq(nil) }
116
+ end
117
+ end
118
+
119
+ context 'when value_type is default' do
120
+ let(:value_type) { nil }
121
+
122
+ context 'when value is a nil' do
123
+ let(:value) { nil }
124
+ it { is_expected.to be_nil }
125
+ end
126
+
81
127
  context 'when value is a string' do
82
128
  let(:value) { 'abcd' }
83
129
  it { is_expected.to eq('abcd') }
84
130
  end
131
+
85
132
  context 'when value is an integer with a string' do
86
133
  let(:value) { '4abcd' }
87
134
  it { is_expected.to eq('4abcd') }
88
135
  end
136
+
89
137
  context 'when value is an integer' do
90
138
  let(:value) { '10' }
91
139
  it { is_expected.to eq('10') }
92
140
  end
141
+
142
+ context 'when value is a boolean' do
143
+ let(:value) { 'true' }
144
+ it { is_expected.to eq('true') }
145
+ end
93
146
  end
147
+
148
+ context 'when value_type is :string' do
149
+ let(:value_type) { NsSettingsUi::Setting::TYPES[:string] }
150
+
151
+ context 'when value is a nil' do
152
+ let(:value) { nil }
153
+ it { is_expected.to eq('') }
154
+ end
155
+
156
+ it_behaves_like 'string'
157
+ end
158
+
159
+ context 'when value_type is :nullable_string' do
160
+ let(:value_type) { NsSettingsUi::Setting::TYPES[:nullable_string] }
161
+
162
+ it_behaves_like 'string'
163
+ it_behaves_like 'nullable_type'
164
+ end
165
+
94
166
  context 'when value_type is :integer' do
95
167
  let(:value_type) { NsSettingsUi::Setting::TYPES[:integer] }
168
+
96
169
  context 'when value is a nil' do
97
170
  let(:value) { nil }
98
- it { is_expected.to eq(nil) }
99
- end
100
- context 'when value is a string' do
101
- let(:value) { 'abcd' }
102
171
  it { is_expected.to eq(0) }
103
172
  end
104
- context 'when value is an integer with a string' do
105
- let(:value) { '4abcd' }
106
- it { is_expected.to eq(4) }
173
+
174
+ it_behaves_like 'integer'
175
+ end
176
+
177
+ context 'when value_type is :nullable_integer' do
178
+ let(:value_type) { NsSettingsUi::Setting::TYPES[:nullable_integer] }
179
+
180
+ it_behaves_like 'integer'
181
+ it_behaves_like 'nullable_type'
182
+ end
183
+
184
+ context 'when value_type is :boolean' do
185
+ let(:value_type) { NsSettingsUi::Setting::TYPES[:boolean] }
186
+
187
+ context 'when value is a nil' do
188
+ let(:value) { nil }
189
+ it { is_expected.to eq(false) }
107
190
  end
108
- context 'when value is an integer' do
109
- let(:value) { '10' }
110
- it { is_expected.to eq(10) }
191
+
192
+ it_behaves_like 'boolean'
193
+ end
194
+
195
+ context 'when value_type is :nullable_boolean' do
196
+ let(:value_type) { NsSettingsUi::Setting::TYPES[:nullable_boolean] }
197
+
198
+ it_behaves_like 'boolean'
199
+ it_behaves_like 'nullable_type'
200
+ end
201
+
202
+ context 'when value_type is :date' do
203
+ let(:value_type) { NsSettingsUi::Setting::TYPES[:date] }
204
+
205
+ context 'when value is a proper date' do
206
+ let(:value) { '2017-05-08' }
207
+ it { is_expected.to eq(Date.parse(value)) }
208
+ end
209
+
210
+ context 'when value is malformatted' do
211
+ let(:value) { '2017-05-df' }
212
+ it { expect { subject }.to raise_error(ArgumentError, 'invalid date') }
111
213
  end
112
214
  end
113
215
  end