ns_settings_ui 1.1.0 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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