require 'spec_helper'

module Sandthorn
  class ConstructorEventsSpec
    include AggregateRoot

    constructor_events :created_event
    attr_reader :name


    def self.create name
      created_event(name) { @name = name }
    end

  end

  describe "::constructor_events" do

    let(:subject) do
      ConstructorEventsSpec.create("name").save
    end

    context "interface" do

      it "should not expose constructor_events methods" do
        expect(subject).not_to respond_to(:created_event)
      end

      it "should create the constructor event on the class" do
        expect(ConstructorEventsSpec.private_methods).to include(:created_event)
      end

    end
  end

  describe "::create" do
    let(:aggregate_id) do
      a = ConstructorEventsSpec.create("create_name")
      a.save
      a.aggregate_id
    end

    it "should create an ConstructorEventsSpec aggregate" do
      expect(ConstructorEventsSpec.find(aggregate_id)).to be_a ConstructorEventsSpec
    end

    it "should set instance variable in aggregate" do
      expect(ConstructorEventsSpec.find(aggregate_id).name).to eq("create_name")
    end

    it "should have created an created_event" do
      expect(Sandthorn.find(aggregate_id, ConstructorEventsSpec).first[:event_name]).to eq("created_event")
    end

    it "should have set the attribute_delta name" do
      expect(Sandthorn.find(aggregate_id, ConstructorEventsSpec).first[:event_data]).to have_key(:name)
      expect(Sandthorn.find(aggregate_id, ConstructorEventsSpec).first[:event_data][:name][:new_value]).to eq("create_name")
    end
  end
end