Clone
content_entry_service_spec.rb
require 'spec_helper'

require_relative '../../../lib/locomotive/steam/adapters/filesystem.rb'
require_relative '../../../lib/locomotive/steam/adapters/mongodb.rb'

describe Locomotive::Steam::ContentEntryService do

  shared_examples_for 'a content entry service' do

    let(:site)              { Locomotive::Steam::Site.new(_id: site_id, locales: %w(en fr nb)) }
    let(:locale)            { :en }
    let(:type_repository)   { Locomotive::Steam::ContentTypeRepository.new(adapter, site, locale) }
    let(:entry_repository)  { Locomotive::Steam::ContentEntryRepository.new(adapter, site, locale, type_repository) }
    let(:service)           { described_class.new(type_repository, entry_repository, locale) }
    let(:type)              { 'bands' }

    describe '#all' do
      subject { service.all(type) }
      it { expect(subject.size).to eq 3 }
      context 'with conditions' do
        subject { service.all(type, kind: 'grunge') }
        it { expect(subject.size).to eq 2 }
      end
      context 'as_json enabled' do
        subject { service.all(type, { kind: 'grunge' }, true) }
        it { expect(subject.first.slice('name', 'leader')).to eq('name' => 'Alice in Chains', 'leader' => 'Layne') }
      end
    end

    describe '#find' do
      let(:id_or_slug) { 'alice-in-chains'}
      subject { service.find(type, id_or_slug) }
      it { expect(subject.name).to eq 'Alice in Chains' }
      context 'with an id' do
        let(:id_or_slug) { entry_id }
        it { expect(subject.name).to eq 'Pearl Jam' }
      end
    end

  end

  context 'MongoDB' do

    it_should_behave_like 'a content entry service' do

      let(:site_id)   { mongodb_site_id }
      let(:adapter)   { Locomotive::Steam::MongoDBAdapter.new(database: 'steam_test', hosts: ['127.0.0.1:27017']) }
      let(:entry_id)  { BSON::ObjectId.from_string('5829ffa087f6435971756881') }

      describe '#create' do
        subject { service.create('messages', { name: 'John', email: 'john@doe.net', message: 'Hello world!' }) }
        it { expect { subject }.to change { service.all('messages').size } }
        it { expect(subject.name).to eq 'John' }
        after { service.delete('messages', subject._id) }
      end

      describe '#update' do
        let!(:message) { service.create('messages', { name: 'John', email: 'john@doe.net', message: 'Hello world!' }) }
        subject { service.update('messages', message._id, { name: 'Jane' }) }
        it { expect { subject }.not_to change { service.all('messages').size } }
        it { expect(subject.name).to eq 'Jane' }
        after { service.delete('messages', message._id) }
      end

    end

  end

  context 'Filesystem' do

    it_should_behave_like 'a content entry service' do

      let(:site_id)   { 1 }
      let(:adapter)   { Locomotive::Steam::FilesystemAdapter.new(default_fixture_site_path) }
      let(:entry_id)  { 'pearl-jam' }

      after(:all) { Locomotive::Steam::Adapters::Filesystem::SimpleCacheStore.new.clear }

      describe '#create' do

        let(:attributes) { { name: 'John', email: 'john@doe.net', message: 'Hello world!' } }

        subject { service.create('messages', attributes, true) }

        it { expect { subject }.to change { service.all('messages').size } }
        it { expect(subject['name']).to eq 'John' }
        it { expect(subject['errors'].blank?).to eq true }

        context 'missing attributes' do

          let(:attributes) { {} }

          it { expect { subject }.not_to change { service.all('messages').size } }
          it { expect(subject['errors']).to eq({ 'name' => ["can't be blank"], 'email' => ["can't be blank"], 'message' => ["can't be blank"] }) }

        end
      end

      describe '#update' do
        let!(:message) { service.create('messages', { name: 'John', email: 'john@doe.net', message: 'Hello world!' }) }
        subject { service.update('messages', message._id, { name: 'Jane' }, true) }
        it { expect { subject }.not_to change { service.all('messages').size } }
        it { expect(subject['name']).to eq 'Jane' }
      end

    end

  end

end