diff --git a/apps/admin/config/routes.rb b/apps/admin/config/routes.rb index 7f8bbfe..1573623 100644 --- a/apps/admin/config/routes.rb +++ b/apps/admin/config/routes.rb @@ -5,3 +5,5 @@ # get '/hello', to: ->(env) { [200, {}, ['Hello from Hanami!']] } get '/', to: 'projects#index', as: :projects get '/settings', to: 'settings#index', as: :settings +get '/settings/new', to: 'settings#new', as: :new_settings +post '/settings/create', to: 'settings#create', as: :create_settings diff --git a/apps/admin/controllers/settings/create.rb b/apps/admin/controllers/settings/create.rb new file mode 100644 index 0000000..eeb4953 --- /dev/null +++ b/apps/admin/controllers/settings/create.rb @@ -0,0 +1,21 @@ +module Admin::Controllers::Settings + class Create + include Admin::Action + + params do + required(:setting).schema do + required(:title).filled(:str?) + end + end + + def call(params) + if params.valid? + SettingRepository.new.create(params[:setting]) + + redirect_to routes.settings_path + else + self.status = 422 + end + end + end +end diff --git a/apps/admin/controllers/settings/new.rb b/apps/admin/controllers/settings/new.rb new file mode 100644 index 0000000..1a60009 --- /dev/null +++ b/apps/admin/controllers/settings/new.rb @@ -0,0 +1,11 @@ +module Admin::Controllers::Settings + class New + include Admin::Action + + expose :settings + + def call(params) + @settings = SettingRepository.new.for_display + end + end +end diff --git a/apps/admin/templates/settings/index.html.slim b/apps/admin/templates/settings/index.html.slim index f4dae0b..33d2a1a 100644 --- a/apps/admin/templates/settings/index.html.slim +++ b/apps/admin/templates/settings/index.html.slim @@ -8,3 +8,5 @@ table.table.table-hover tr td = key td = value + +.new-settings = link_to 'New Settings', routes.new_settings_path diff --git a/apps/admin/templates/settings/new.html.slim b/apps/admin/templates/settings/new.html.slim new file mode 100644 index 0000000..cd527e5 --- /dev/null +++ b/apps/admin/templates/settings/new.html.slim @@ -0,0 +1,3 @@ +h2 New Settings + += form(settings) diff --git a/apps/admin/views/settings/new.rb b/apps/admin/views/settings/new.rb new file mode 100644 index 0000000..8b57292 --- /dev/null +++ b/apps/admin/views/settings/new.rb @@ -0,0 +1,14 @@ +module Admin::Views::Settings + class New + include Admin::View + + def form(settings) + form_for :setting, routes.create_settings_path do + label :title + text_field :title, value: settings.title + + submit 'Create' + end + end + end +end diff --git a/lib/contributors/repositories/setting_repository.rb b/lib/contributors/repositories/setting_repository.rb index 1867773..8f48ec5 100644 --- a/lib/contributors/repositories/setting_repository.rb +++ b/lib/contributors/repositories/setting_repository.rb @@ -1,6 +1,6 @@ class SettingRepository < Hanami::Repository def for_display - settings.select(:title).first + settings.select(:title).last end end diff --git a/spec/admin/controllers/settings/create_spec.rb b/spec/admin/controllers/settings/create_spec.rb new file mode 100644 index 0000000..38d539b --- /dev/null +++ b/spec/admin/controllers/settings/create_spec.rb @@ -0,0 +1,30 @@ +RSpec.describe Admin::Controllers::Settings::Create, type: :action do + let(:action) { described_class.new } + let(:settings_repo) { SettingRepository.new } + + after { settings_repo.clear } + + + describe '#call' do + context 'correct params' do + let(:params) { Hash[setting: {title: 'hello'}] } + + it 'creates a new setting record' do + expect{action.call(params)}.to change{settings_repo.all.count}.by(1) + end + end + + context 'incorrect params' do + let(:params) { Hash[] } + + it 'does not creates a new setting record' do + expect{action.call(params)}.to_not change{settings_repo.all.count} + end + + it 'returns 422' do + response = action.call(params) + expect(response[0]).to eq 422 + end + end + end +end diff --git a/spec/admin/controllers/settings/index_spec.rb b/spec/admin/controllers/settings/index_spec.rb index 9bd34c1..965db9f 100644 --- a/spec/admin/controllers/settings/index_spec.rb +++ b/spec/admin/controllers/settings/index_spec.rb @@ -22,7 +22,7 @@ after { settings_repo.clear } - it { expect(action.settings).to be_a(Setting) } + it { expect(action.settings).to eq({title: 'Hanami'}) } end end end diff --git a/spec/contributors/repositories/setting_repository_spec.rb b/spec/contributors/repositories/setting_repository_spec.rb index b71ea9f..8298eec 100644 --- a/spec/contributors/repositories/setting_repository_spec.rb +++ b/spec/contributors/repositories/setting_repository_spec.rb @@ -10,8 +10,7 @@ end context 'returns settings with columns to display' do - it { expect(repo.for_display).to be_a Setting } - it { expect(repo.for_display.to_hash).to eq ({title: 'Hanami'}) } + it { expect(repo.for_display).to eq({title: 'Hanami'}) } end end end