124 lines
3.8 KiB
Ruby
124 lines
3.8 KiB
Ruby
require 'minitest/autorun'
|
|
require_relative '../../../structures/collection'
|
|
|
|
include DataRepository
|
|
|
|
describe Collection do
|
|
before do
|
|
@repository = DataRepository::Repository.new
|
|
@dummy_class = Class.new do
|
|
attr_accessor :id
|
|
def initialize(arguments={}); self.id = arguments.fetch(:id); end
|
|
def fetch; self; end
|
|
def to_hash; { id: id }; end
|
|
def ==(other); id.to_s == other.id.to_s; end
|
|
end
|
|
|
|
@defaults = { repository: @repository, member_class: @dummy_class}
|
|
end
|
|
|
|
describe '#add' do
|
|
it 'adds a member to the collection' do
|
|
member = @dummy_class.new(id: 1)
|
|
collection = Collection.new(@defaults)
|
|
collection.add(member)
|
|
collection.to_a.must_include member
|
|
end
|
|
end
|
|
|
|
describe '#delete' do
|
|
it 'deletes a member from the collection' do
|
|
member = @dummy_class.new(id: 1)
|
|
collection = Collection.new(@defaults)
|
|
collection.add(member)
|
|
collection.delete(member)
|
|
collection.to_a.wont_include member
|
|
end
|
|
end #delete
|
|
|
|
describe '#each' do
|
|
it 'yields members of the collection as the initialized member_class' do
|
|
member = @dummy_class.new(id: 1)
|
|
collection = Collection.new(@defaults)
|
|
collection.add(member)
|
|
collection.store
|
|
|
|
rehydrated_collection =
|
|
Collection.new(@defaults.merge(signature: collection.signature))
|
|
rehydrated_collection.fetch
|
|
rehydrated_collection.to_a.first.must_be_instance_of @dummy_class
|
|
end
|
|
|
|
it 'returns an enumerator if no block given' do
|
|
member = @dummy_class.new(id: 1)
|
|
collection = Collection.new({ repository: @repository })
|
|
collection.add(member)
|
|
collection.store
|
|
|
|
rehydrated_collection =
|
|
Collection.new(@defaults.merge(signature: collection.signature))
|
|
rehydrated_collection.fetch
|
|
|
|
enumerator = rehydrated_collection.each
|
|
enumerator.next.must_be_instance_of @dummy_class
|
|
end
|
|
end #each
|
|
|
|
describe '#fetch' do
|
|
it 'resets the collection with data from the data repository' do
|
|
member1 = @dummy_class.new(id: 1)
|
|
member2 = @dummy_class.new(id: 2)
|
|
collection = Collection.new(@defaults)
|
|
collection.add(member1)
|
|
collection.store
|
|
|
|
rehydrated_collection =
|
|
Collection.new(@defaults.merge(signature: collection.signature))
|
|
rehydrated_collection.add(member2)
|
|
|
|
rehydrated_collection.to_a.must_include(member2)
|
|
rehydrated_collection.to_a.wont_include(member1)
|
|
rehydrated_collection.fetch
|
|
rehydrated_collection.to_a.must_include(member1)
|
|
rehydrated_collection.to_a.wont_include(member2)
|
|
end
|
|
|
|
it 'empties the collection if it was not persisted to the repository' do
|
|
member = @dummy_class.new(id: 1)
|
|
collection = Collection.new(@defaults)
|
|
collection.add(member)
|
|
collection.to_a.length.must_equal 1
|
|
collection.fetch
|
|
collection.to_a.must_be_empty
|
|
end
|
|
end #fetch
|
|
|
|
describe '#store' do
|
|
it 'persists the collection to the data repository' do
|
|
member = @dummy_class.new(id: 1)
|
|
collection = Collection.new(@defaults)
|
|
collection.add(member)
|
|
collection.store
|
|
|
|
rehydrated_collection =
|
|
Collection.new(@defaults.merge(signature: collection.signature))
|
|
rehydrated_collection.fetch
|
|
rehydrated_collection.map { |member| member.id }.must_include member.id
|
|
end
|
|
end #store
|
|
|
|
describe '#to_json' do
|
|
it 'renders a JSON representation of the collection' do
|
|
member = @dummy_class.new(id: 1)
|
|
collection = Collection.new(@defaults)
|
|
collection.add(member)
|
|
collection.store
|
|
|
|
representation = JSON.parse(collection.to_json)
|
|
representation.size.must_equal 1
|
|
representation.first.fetch('id').must_equal member.id
|
|
end
|
|
end #to_json
|
|
end # Collection
|
|
|