require 'spec_helper'
require 'logger'
describe CephStorage::StorageObject::XattrEnumerator do
  let(:config) { cluster_config }
  let(:spconfig) { spec_config }
  let(:cluster) { CephStorage::ClusterFactory.build config }
  let(:rule_id) { spconfig[:pool][:rule_id] }
  let(:pool_name) { spconfig[:pool][:name] }
  let(:pool) { cluster.pool(pool_name) }

  describe 'pool creation' do
    subject { pool }
    it 'should be able to create pool' do
      expect { subject.create(rule_id: rule_id) }.to_not raise_exception
    end

    it 'should be writable' do
      expect { pool.stat }.not_to raise_exception
      expect(pool.stat).to be_a Hash
    end
  end

  let(:object_name) { spconfig[:pool][:object_name] }
  let(:storage_object) { pool.storage_object(object_name) }

  describe 'Storage Object' do
    subject { storage_object }

    it 'should be writeable' do
      expect { subject.overwrite('some content') }.not_to raise_exception
    end
  end

  describe 'XattrEnumerator' do
    let(:xattr_name) { spconfig[:pool][:xattr_name] }
    let(:xattr_value) { spconfig[:pool][:xattr_value] }
    let(:xattr_enumerator) { storage_object.xattr_enumerator }
    subject { xattr_enumerator }

    it 'should be a CephRuby::XattrEnumerator' do
      expect(subject).to be_a ::CephStorage::StorageObject::XattrEnumerator
    end

    it 'should be a CephRuby::XattrEnumerator' do
      expect(subject).to be_a ::CephRuby::XattrEnumerator
    end

    it 'should have 0 xattrs' do
      expect(subject.inject(0) { |a, _e| a + 1 }).to be 0
    end

    describe 'after populating' do
      before do
        10.times do |i|
          storage_object.xattr("#{xattr_name}.#{i}").value = xattr_value
        end
      end

      it 'should have 10 xattrs' do
        expect(subject.inject(0) { |a, _e| a + 1 }).to be 10
      end

      it 'should return CephStorage::Xattrs' do
        expect(subject.first).to be_a CephStorage::StorageObject::Xattr
      end
    end
  end

  describe 'pool deletion' do
    subject { pool }
    it 'should be able to delete pool' do
      expect { subject.destroy }.not_to raise_exception
    end
  end
end