From d7c8342817ceaebbf01166ac327dedf9246fc868 Mon Sep 17 00:00:00 2001 From: Andreas Stephanides Date: Sun, 13 Jan 2019 10:11:25 +0100 Subject: [PATCH] additional neuigkeit test --- .../neuigkeiten_controller_spec.rb | 142 +++++++++++++----- spec/models/meeting_spec.rb | 7 + spec/models/neuigkeit_spec.rb | 59 +++++--- spec/models/shared_examples/basic.rb | 11 ++ spec/spec_helper.rb | 2 + spec/support/controller_macros.rb | 27 +++- 6 files changed, 189 insertions(+), 59 deletions(-) create mode 100644 spec/models/shared_examples/basic.rb diff --git a/spec/controllers/neuigkeiten_controller_spec.rb b/spec/controllers/neuigkeiten_controller_spec.rb index c183ad1..3b72dee 100644 --- a/spec/controllers/neuigkeiten_controller_spec.rb +++ b/spec/controllers/neuigkeiten_controller_spec.rb @@ -2,54 +2,126 @@ require 'spec_helper' RSpec.describe NeuigkeitenController, :type => :controller do - let(:rubrik) {FactoryGirl.create(:rubrik, public:true)} - let(:intern_rubrik) {FactoryGirl.create(:rubrik, public:false, name: "InternRubrik")} - let(:user) {FactoryGirl.create(:user)} - let(:fet_user) do - user=FactoryGirl.create(:user) - user.add_role(:fetadmin) - end + + let(:neuigkeit) {(FactoryGirl.create(:neuigkeit, :with_rubrik))} + let(:intern_neuigkeit) {(FactoryGirl.create(:neuigkeit,:with_intern_rubrik))} - let(:neuigkeit) {(FactoryGirl.create(:neuigkeit, rubrik_id: rubrik.id, author_id: user.id, datum: 4.hours.ago))} - let(:intern_neuigkeit) {(FactoryGirl.create(:neuigkeit, rubrik_id: intern_rubrik.id, author_id: user.id, datum: 4.hours.ago))} - let(:valid_session) { {current_user: fet_user} } - let(:public_session){{}} + let(:valid_session) {{}} + # setting up shared examples + let(:object_class) {Neuigkeit} + let(:object_variable) {:neuigkeit} + let(:assigned_object_variable){neuigkeit} + + #let(:allow_fet_user) {allow(@controller).to receive(:current_user).and_return(fet_user)} + + describe "GET #show" do - it "render show template" do - get :show, {id: neuigkeit.id}, public_session - expect(response).to have_http_status(200) - expect(response).to render_template(:show) + let(:action) { get :show, {id: neuigkeit.id, rubrik_id: neuigkeit.rubrik.id}} + + it_behaves_like "it is success" + it_behaves_like "it assigns object" + + context "with internal news" do + let(:action) { get :show, {id: intern_neuigkeit.id, rubrik_id: intern_neuigkeit.rubrik.id}} + it_behaves_like "it is restricted" + + context "with fet user" do + with_fet_user + it_behaves_like "it is success" + end end - + it "denys access to unpublished news" do - neuigkeit.datum=5.hours.from_now - neuigkeit.save! - get :show, {id: neuigkeit.id}, public_session + neuigkeit=FactoryGirl.create(:neuigkeit, :unpublished) + get :show, {id: neuigkeit.id}, valid_session expect(response).to have_http_status(302) end - it "denys access to intern news" do - get :show, {id: intern_neuigkeit.id}, public_session - expect(response).to have_http_status(302) - end - - it "assignes neuigkeit" do - - get :show, {id: neuigkeit.id }, public_session - expect(assigns(:neuigkeit)).to eq(neuigkeit) - end - describe "GET #show view contents" do - + + context "with rendered views" do render_views - it "renders the name of the neuigkeit" do - get :show, {id: neuigkeit.id} , public_session + before do + neuigkeit.rubrik + intern_neuigkeit + end + + it "shows the name" do + action expect(response.body).to match neuigkeit.name end - it "has linkes to external rubrik" do + it "has only links to external rubrik" do + get :show, {id: neuigkeit.id}, public_session + expect(response.body).to match rubrik.name + expect(response.body).not_to match intern_rubrik.name + end + + context "and fet user" do + with_fet_user + it "has all links to internal and external rubriken" do + action + expect(response.body).to match intern_rubrik.name + expect(response.body).to match rubrik.name + end + end + it "shows datum in response" do + action + expect(response.body).to match I18n.l(neuigkeit.datum.to_date) end end end - + describe "GET #edit" do + let(:action) { get :edit, {id: neuigkeit.id, rubrik_id: neuigkeit.rubrik.id}} + include_examples "it is restricted" + it_behaves_like "it assigns object" + it_behaves_like "it assigns persisted object" + context "with fet user" do + with_fet_user + it_behaves_like "it is success" + end + end + describe "GET #new" do + let(:action) { get :new, {rubrik_id: neuigkeit.rubrik.id}} + include_examples "it assigns new object" + include_examples "it is restricted" + context "with fet user" do + with_fet_user + it_behaves_like "it is success" + end + end + + describe "GET add_calentry" do + let(:action) { get :add_calentry, {id: neuigkeit.id, rubrik_id: neuigkeit.rubrik.id}} + + it_behaves_like "it is restricted" + context "with fet user" do + with_fet_user + it_behaves_like "it is success" + it "renders edit template" do + expect(action).to render_template(:edit) + end + + it "adds calentry to neuigkeit" do + action + expect(assigns(:neuigkeit).calentries).not_to be_empty + end + end + end + + describe "GET unpublish" do + let(:action) {get :unpublish, {id: neuigkeit.id, rubrik_id: neuigkeit.rubrik.id}} + it_behaves_like "it is restricted" + context "with fet user" do + with_fet_user + it "redirects to neuigkeit" do + expect(action).to redirect_to(rubrik_neuigkeit_url(rubrik,neuigkeit)) + end + it "assignes unpublished neuigkeit" do + action + expect(assigns(:neuigkeit)).not_to be_published + end + + end + end end diff --git a/spec/models/meeting_spec.rb b/spec/models/meeting_spec.rb index aa5ad97..6aa23c2 100644 --- a/spec/models/meeting_spec.rb +++ b/spec/models/meeting_spec.rb @@ -7,7 +7,10 @@ RSpec.describe Meeting, :type => :model do let(:calentry){FactoryGirl.build(:calentry, calendar_id: calendar.id, typ: 2)} let(:meetingtyp){FactoryGirl.create(:meetingtyp, rubrik_id: rubrik.id)} let(:meeting){FactoryGirl.build(:meeting, meetingtyp_id: meetingtyp.id)} + let(:object_variable) {meeting} + it_behaves_like "a valid object" + it "should be created" do meeting.calentry=calentry expect(meeting).to be_valid @@ -23,10 +26,14 @@ RSpec.describe Meeting, :type => :model do meeting.calentry.dauer=7 expect(meeting).to be_valid end + context "without calentry" do +# let(:meeting){FactoryGirl.build(:meeting, :without_calentry, meetingtyp_id: meetingtyp.id)} + it "should be creating a calentry typ 2" do meeting.create_calentry expect(meeting.calentry.typ).to be 2 end + end it "should be having an alias title for text" do expect(meeting.title).to eq(meeting.text) end diff --git a/spec/models/neuigkeit_spec.rb b/spec/models/neuigkeit_spec.rb index 8331bca..7e60b94 100644 --- a/spec/models/neuigkeit_spec.rb +++ b/spec/models/neuigkeit_spec.rb @@ -1,19 +1,36 @@ require 'spec_helper' describe Neuigkeit do - let(:rubrik) {FactoryGirl.create(:rubrik)} - let(:user) {FactoryGirl.create(:user)} - let(:calendar) {FactoryGirl.create(:calendar,updated_at: 1.hour.ago)} - let(:neuigkeit) {(FactoryGirl.build(:neuigkeit, rubrik_id: rubrik.id, author_id: user.id))} + + let(:neuigkeit) {(FactoryGirl.build(:neuigkeit, :with_rubrik))} + let(:intern_neuigkeit) {FactoryGirl.build(:neuigkeit, :with_intern_rubrik)} + let(:unpublished_neuigkeit){FactoryGirl.build(:neuigkeit, :unpublished,:with_rubrik)} let(:attachment) {FactoryGirl.build_stubbed(:attachment)} + + let(:calentry) { + FactoryGirl.build(:calentry, start: 1.hour.ago, ende: 5.minutes.ago) + } - let(:calentry) do - c = FactoryGirl.build(:calentry, calendar_id: calendar.id, start: 1.hour.ago, ende: 5.minutes.ago) - c.object=neuigkeit - c.save - c + let(:object_variable) {neuigkeit} + + it_behaves_like "a valid object" + + it "is published" do expect(neuigkeit).to be_published end + it "is public" do expect(neuigkeit).to be_public end + it "has no meeting" do expect(neuigkeit).not_to be_is_annoncement end + +# it "failes" do expect(true).to be_falsey end + + it "is published if datum is in the past" do + neuigkeit.datum=5.hours.ago + expect(neuigkeit).to be_published end - + it "is unpublished if datum is in the future" do + neuigkeit.datum=5.hours.from_now + expect(neuigkeit).not_to be_published + end + + [ :rubrik, :author].each do |attr| # :title,:text to be discussed it "should not be valid without #{attr}" do neuigkeit.send("#{attr}=".to_sym,nil) @@ -21,18 +38,20 @@ describe Neuigkeit do expect(neuigkeit.errors[attr]).to have_at_least(1).items end end - it "should be created" do - expect(neuigkeit).to be_valid - expect(neuigkeit.save).to be true - end - - it "should be valid" do - fp = FactoryGirl.build(:neuigkeit, rubrik_id: rubrik.id, author_id: user.id) - expect(fp).to be_valid + + context "with meeting" do + let(:neuigkeit) {(FactoryGirl.build(:neuigkeit, :with_rubrik, :with_meeting))} + let(:object_variable) {neuigkeit} + it_behaves_like "a valid object" + it "has meeting" do expect(neuigkeit.meeting).to be_truthy end + it "is annoncement" do expect(neuigkeit).to be_is_annoncement end end it "responds to attachments" do expect(neuigkeit.respond_to?(:attachments)).to be true end + + + pending "uses titlepic attachments as picture" do # this test seems broken expect(neuigkeit.respond_to?(:picture_robust)).to be true attachment.flag_titlepic = true @@ -43,10 +62,6 @@ describe Neuigkeit do neuigkeit.calentries << calentry expect(neuigkeit).to be_is_event - end - it "it is published if datum is in the past" do - neuigkeit.datum=5.hours.ago - expect(neuigkeit).to be_published end it "" do end diff --git a/spec/models/shared_examples/basic.rb b/spec/models/shared_examples/basic.rb new file mode 100644 index 0000000..34323bb --- /dev/null +++ b/spec/models/shared_examples/basic.rb @@ -0,0 +1,11 @@ +shared_examples "a valid object" do + it "is valid" do + expect(object_variable).to be_valid + end + it "can be saved" do + expect(object_variable.save).to be_truthy + end +# it "failes" do +# expect(true).to be_falsey +# end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 8423afd..5ff682e 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -16,6 +16,8 @@ require 'devise' # in spec/support/ and its subdirectories. Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f } Dir[Rails.root.join("spec/models/shared_examples/**/*.rb")].each {|f| require f} +Dir[Rails.root.join("spec/models/shared_examples/*.rb")].each {|f| require f} +#require 'models/shared_examples/basic.rb' Dir[Rails.root.join("spec/controllers/shared_examples/**/*.rb")].each {|f| require f} RSpec.configure do |config| diff --git a/spec/support/controller_macros.rb b/spec/support/controller_macros.rb index 229a09a..d7ebb81 100644 --- a/spec/support/controller_macros.rb +++ b/spec/support/controller_macros.rb @@ -1,9 +1,31 @@ module ControllerMacros -# include Devise::TestHelpers, :type=>:controller + # include Devise::TestHelpers, :type=>:controller + def with_fet_user + + let(:fet_user) {FactoryGirl.create(:other_user, :fetuser)} + + before(:each) do + allow(@controller).to receive(:current_user).and_return(fet_user) + allow(@controller).to receive(:current_ability).and_return(Ability.new(fet_user)) + end + end + def with_fet_admin + + let(:fet_user)do + fet_user=FactoryGirl.create(:other_user) + fet_user.add_role("fetadmin") + fet_user + end + before(:each) do + allow(@controller).to receive(:current_user).and_return(fet_user) + allow(@controller).to receive(:current_ability).and_return(Ability.new(fet_user)) + end + end + def login_fet_user before(:each) do @request.env["devise.mapping"] = Devise.mappings[:user] - user = FactoryGirl.build(:user) + user = FactoryGirl.build(:other_user) user = User.find_by_email(user.email) || user user.save user.add_role(:fetuser) @@ -21,6 +43,7 @@ module ControllerMacros sign_in user end end + def logout_user before(:each) do sign_out :user