minitest - During testing in Rails 3, updating a record causes related records to be deleted -
i'm running tests using minitest in rails 3. have requirements model , ind_requirements model serves intersection between industries model , requirements model. have dependent :destroy set on has_many on requirements model, removing doesn't seem have impact on i'm seeing.
this controller testing, i'm not interacting ui or suspect reported here: active record update_attribute executes delete query on associated object(child) of object(parent) when parent updated
when @requirement.update_attributes hit, following output in log:
processing requirementscontroller#update html parameters: {"requirement"=>{"reqtext"=>"second version", "reqtitle"=>"second version"}, "id"=>"1"} user load (0.1ms) select "users".* "users" "users"."id" = ? limit 1 [["id", 1]] sql (0.1ms) select "requirements"."id" t0_r0, "requirements"."reqtitle" t0_r1, "requirements"."reqtext" t0_r2, "requirements"."created_at" t0_r3, "requirements"."updated_at" t0_r4, "requirements"."category_id" t0_r5, "requirements"."status" t0_r6, "requirements"."source_id" t0_r7, "requirements"."sortorder" t0_r8, "requirements"."version" t0_r9, "requirements"."active" t0_r10, "categories"."id" t1_r0, "categories"."catname" t1_r1, "categories"."created_at" t1_r2, "categories"."updated_at" t1_r3, "categories"."catabbr" t1_r4 "requirements" left outer join "categories" on "categories"."id" = "requirements"."category_id" "requirements"."active" = 't' , "requirements"."id" = ? order categories.catname limit 1 [["id", "1"]] (0.2ms) select count(*) "roles" inner join "role_assignments" on "roles"."id" = "role_assignments"."role_id" "role_assignments"."user_id" = 1 , (rolename = 'editor') (0.2ms) select count(*) "roles" inner join "role_assignments" on "roles"."id" = "role_assignments"."role_id" "role_assignments"."user_id" = 1 , (rolename = 'administrator') (0.2ms) savepoint active_record_1 industry load (0.2ms) select "industries".* "industries" inner join "ind_requirements" on "industries"."id" = "ind_requirements"."industry_id" "ind_requirements"."requirement_id" = 1 order indname sql (0.2ms) delete "ind_requirements" "ind_requirements"."requirement_id" = 1 , "ind_requirements"."industry_id" = 2 sql (0.5ms) insert "requirement_versions" ("category_id", "created_at", "reqtext", "reqtitle", "req_id", "status", "updated_at", "version") values (?, ?, ?, ?, ?, ?, ?, ?) [["category_id", nil], ["created_at", wed, 12 mar 2014 06:00:13 utc +00:00], ["reqtext", "this test general requirement purpose of, um, testing things"], ["reqtitle", "test requirement 19"], ["req_id", 1], ["status", "public"], ["updated_at", wed, 12 mar 2014 06:00:13 utc +00:00], ["version", 1]] (0.1ms) update "requirements" set "reqtext" = 'second version', "reqtitle" = 'second version', "version" = 2, "updated_at" = '2014-03-12 06:00:13.418730' "requirements"."id" = 1 (0.1ms) release savepoint active_record_1 note delete from. breaks test once these records deleted test database, subsequent code doesn't work properly. delete not triggered when running in development, in test.
is there config option i'm missing?
here requirement.rb file (without of other methods aren't part of this):
class requirement < activerecord::base has_many :ind_requirements, dependent: :destroy has_many :requirement_versions has_many :industries, through: :ind_requirements has_many :responses belongs_to :category scope :active, where(:active => true) default_scope active.includes(:category).order('categories.catname') scope :submitted, where(:status => :submitted) scope :public, where(:status => :public) accepts_nested_attributes_for :requirement_versions attr_accessible :reqtext, :reqtitle, :industry_ids, :category_id, :catname, :status, :user_id, :source_id, :catabbr, :reqnumber, :sortorder, :requirement_versions_attributes here actual test case:
test "when requirement reverted, previous associated industry list restored" login_admin @requirement = create(:requirement) @industry = create(:industry, indname: "first industry") @indlink = create(:ind_requirement, requirement_id: @requirement.id) @indlink.save! put :update, id: @requirement, requirement: { reqtext: "second version", reqtitle: "second version"} @industry = create(:industry, indname: "second industry") @indlink.industry_id = @industry.id @indlink.save! :revert, id: @requirement @requirement = requirement.find(@requirement.id) @indlink = @requirement.ind_requirements.first assert_equal(@indlink.industry.indname, "first industry") end
the problem when sending update requirements, sending updated parameters: put :update, id: @requirement, requirement: { reqtext: "second version", reqtitle: "second version"}, not including parameters checkboxes, wasn't modifying them. unfortunately, end result industries deleted. imagine because absence of parameters interpreted not aren't being updated, rather have been deleted.
Comments
Post a Comment