# encoding: utf-8 require "spec_helper" module ActiveMerge describe SimpleService do describe "#first" do it "инициализируется первым аргументом" do lord = Lord.create! service = SimpleService.new lord, Lord.create! service.first.should eq lord end it "не инициализируется если значение не является объектом ActiveRecord" do service = SimpleService.new 1, Lord.create! service.first.should be_nil end it "не инициализируется если значение не сохранено" do service = SimpleService.new Lord.new, Lord.create! service.first.should be_nil end end describe "#second" do it "инициализируется вторым аргументом" do lord = Lord.create! service = SimpleService.new Lord.create!, lord service.second.should eq lord end it "не инициализируется если первый аргумент не инициализирован" do service = SimpleService.new 1, Lord.create! service.second.should be_nil end it "не инициализируется если класс второго аргумента отличен от первого" do lord = Lord.create! service = SimpleService.new lord, Man.create!(lord: lord) service.second.should be_nil end it "не инициализируется если значение не сохранено" do service = SimpleService.new Lord.create!, Lord.new service.second.should be_nil end end describe "#links" do let!(:lords) { 2.times.map{ Lord.create }} let!(:domain) { lords.last.domains.create! } let!(:man) { lords.last.men.create! } let!(:service){ SimpleService.new lords.first, lords.last } it "contains links rebinded from the second record to the first one" do links = service.links links.should include(domain) links.should include(man) service.links.each do |link| link.lord_id.should eq lords.first.id end end end describe "#valid?" do it "возвращает true если #second инициализирован" do SimpleService.new(Lord.create!, Lord.create!).should be_valid end it "возвращает false если #second не инициализирован" do service = SimpleService.new(Lord.create!, nil) service.should_not be_valid service.errors.should be_translated end end describe "#provide" do let!(:lords) { 2.times.map{ Lord.create! }} let!(:domains) { lords.map{ |lord| lord.domains.create! }} let!(:men) { lords.map{ |lord| lord.men.create! }} let!(:service) { SimpleService.new lords.first, lords.last } context "если перепривязка разрешена" do it "не вызывает исключений" do expect{ service.provide }.not_to raise_error end it "объединяет записи" do begin; service.provide; rescue; end Lord.count.should eq 1 Lord.first.domains.count.should eq 2 Lord.first.men.count.should eq 2 end end context "если перепривязка не может быть выполнена" do before do lords.last.stub(:destroy!).and_raise lords.last.stub(:errors).and_return({ base: "ошибка удаления" }) end it "вызывает исключение" do expect{ service.provide }.to raise_error end it "не объединяет записи" do begin; service.provide; rescue; end Lord.count.should eq 2 Lord.all.each do |lord| lord.domains.count.should eq 1 lord.men.count.should eq 1 end end it "добавляет ошибки в массив" do begin; service.provide; rescue; end service.errors.should_not be_blank end end context "при ошибке валидации" do before { service.stub(:second).and_return nil } it "вызывает исключение" do service.stub(:second).and_return nil expect{ service.provide }.to raise_error end it "добавляет ошибки в массив" do begin; service.provide; rescue; end service.errors.should_not be_blank end end end end end