require 'spec_helper'

describe Epp::Eis::ContactCommands do
  
  before(:each) do
    @server = Epp::Server.new(server: '127.0.0.1', tag: 'username', password: 'password')
  end
  
  describe 'check_contact' do
    before(:each) do
      expect(@server).to receive(:send_request) do |xml|
        @request = Nokogiri::XML(xml)
        xml_mock('responses/contact/check_contact_1000.xml')
      end
    end
    
    context 'request' do
      it 'contains contact id' do
        @server.check_contact('CID:FRAKTAL:1')
        expect(@request.css('contact|check contact|id', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eq('CID:FRAKTAL:1')
      end
    end
    
    context 'response' do
      it 'has status code 1000' do
        expect(@server.check_contact('CID:FRAKTAL:1').code).to eq(1000)
      end

      context 'when multiple contact names are provided' do
        it 'has multiple contact check items in response object' do
          expect(@server.check_contact('CID:FRAKTAL:1', 'CID:FRAKTAL:2').items.size).to eq(2)
        end
      end
    end
  end
  
  describe 'create_contact' do
    before(:each) do
      expect(@server).to receive(:send_request) do |xml|
        @request = Nokogiri::XML(xml)
        xml_mock('responses/contact/create_contact_1000.xml')
      end
      @response = @server.create_contact('CID:TEST:10', 'Test', 'Test Street 11-2', 'Test City', '123456', 'EE', '+372.5555555', 'test@test.com', '37812124567', 'op')
    end
    
    context 'request' do
      it 'contains contact id' do
        expect(@request.css('contact|create contact|id', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eq('CID:TEST:10')
      end
      
      it 'contains contact name' do
        expect(@request.css('contact|create contact|postalInfo contact|name', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eq('Test')
      end
      
      it 'contains street' do
        expect(@request.css('contact|create contact|postalInfo contact|addr contact|street', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eq('Test Street 11-2')
      end
      
      it 'contains city' do
        expect(@request.css('contact|create contact|postalInfo contact|addr contact|city', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eq('Test City')
      end
      
      it 'contains postal code' do
        expect(@request.css('contact|create contact|postalInfo contact|addr contact|pc', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eq('123456')
      end
      
      it 'contains country code' do
        expect(@request.css('contact|create contact|postalInfo contact|addr contact|cc', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eq('EE')
      end
      
      it 'contains phone number' do
        expect(@request.css('contact|create contact|voice', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eq('+372.5555555')
      end
      
      it 'contains phone email' do
        expect(@request.css('contact|create contact|email', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eq('test@test.com')
      end
      
      it 'contains identification code' do
        expect(@request.css('contact|create contact|ident', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eq('37812124567')
      end
      
      it 'contains identification type' do
        expect(@request.css('contact|create contact|ident', 'contact' => Epp::Eis::XML_NS_CONTACT).first['type']).to eq('op')
      end
    end
    
    context 'response' do
      it 'returns contact id' do
        expect(@response.contact_id).to eq('CID:TEST:10')
      end

      it 'returns contact create date' do
        expect(@response.contact_create_date).to eq('2010-02-08T15:50:55+02:00')
      end
    end
  end
  
  describe 'info_contact' do
    before(:each) do
      expect(@server).to receive(:send_request) do |xml|
        @request = Nokogiri::XML(xml)
        xml_mock('responses/contact/info_contact_1000.xml')
      end
      @response = @server.info_contact('CID:TEST:1')
    end
    
    context 'request' do
      it 'contains contact id' do
        expect(@request.css('contact|info contact|id', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eq('CID:TEST:1')
      end
    end
    
    context 'response' do
      it 'returns contact id' do
        expect(@response.contact_id).to eq('CID:TEST:1')
      end

      it 'returns roid' do
        expect(@response.contact_roid).to eq('C0000000006-EPP')
      end

      it 'returns status' do
        expect(@response.contact_status).to eq('linked')
      end
      
      it 'returns name' do
        expect(@response.contact_name).to eq('Uus nimi ajee')
      end
      
      it 'returns street' do
        expect(@response.contact_street).to eq('Kastani')
      end
      
      it 'returns city' do
        expect(@response.contact_city).to eq('Tallinn')
      end
      
      it 'returns postal code' do
        expect(@response.contact_postal_code).to eq('10613')
      end
      
      it 'returns country code' do
        expect(@response.contact_country_code).to eq('EE')
      end
      
      it 'returns contact email' do
        expect(@response.contact_email).to eq('test@test.host')
      end
    end
  end
  
  describe 'update_contact' do
    before(:each) do
      expect(@server).to receive(:send_request) do |xml|
        @request = Nokogiri::XML(xml)
        xml_mock('responses/contact/update_contact_1000.xml')
      end
      @response = @server.update_contact('CID:TEST:10', 'Test', 'Test Street 11-2', 'Test City', '123456', 'EE', '+372.5555555', 'test@test.com', '37812124567', 'op', legal_mock('test.pdf'), 'pdf')
    end
    
    context 'request' do
      it 'contains contact id' do
        expect(@request.css('contact|update contact|id', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eq('CID:TEST:10')
      end
      
      it 'contains contact name' do
        expect(@request.css('contact|update contact|postalInfo contact|name', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eql('Test')
      end
      
      it 'contains street' do
        expect(@request.css('contact|update contact|postalInfo contact|addr contact|street', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eql('Test Street 11-2')
      end
      
      it 'contains city' do
        expect(@request.css('contact|update contact|postalInfo contact|addr contact|city', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eql('Test City')
      end
      
      it 'contains postal code' do
        expect(@request.css('contact|update contact|postalInfo contact|addr contact|pc', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eql('123456')
      end
      
      it 'contains country code' do
        expect(@request.css('contact|update contact|postalInfo contact|addr contact|cc', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eql('EE')
      end
      
      it 'contains phone number' do
        expect(@request.css('contact|update contact|voice', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eql('+372.5555555')
      end
      
      it 'contains phone email' do
        expect(@request.css('contact|update contact|email', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eql('test@test.com')
      end
      
      it 'contains identification code' do
        expect(@request.css('contact|update contact|ident', 'contact' => Epp::Eis::XML_NS_CONTACT).text).to eql('37812124567')
      end
      
      it 'contains identification type' do
        expect(@request.css('contact|update contact|ident', 'contact' => Epp::Eis::XML_NS_CONTACT).first['type']).to eql('op')
      end
    end
    
    context 'response' do
      it 'returns response code' do
        expect(@response.code).to eq(1000)
      end

      it 'returns response message' do
        expect(@response.message).to eq('Command completed successfully')
      end
    end
  end
end