require 'test_helper'

class ResponseTest < Test::Unit::TestCase

  context 'Response to account command' do

    setup do
      @balance = 0.1 * rand(1e4)
      @hash = { 'balance' => @balance.to_s }
      @response = TextMagic::API::Response.account(@hash)
    end

    should 'be an OpenStruct instance' do
      @response.class.should == OpenStruct
    end

    should 'have balance' do
      @response.balance.should be_close(@balance, 1e-10)
    end
  end

  context 'Response to send command with single phone number' do

    setup do
      @message_id, @phone = random_string, random_phone
      @text = random_string
      @parts_count = 1 + rand(3)
      @hash = { 'message_id' => { @message_id => @phone }, 'sent_text' => @text, 'parts_count' => @parts_count }
      @response = TextMagic::API::Response.send(@hash, true)
    end

    should 'equal to the message_id' do
      @response.should == @message_id
    end

    should 'have sent_text' do
      @response.sent_text.should == @text
    end

    should 'have parts_count' do
      @response.parts_count.should == @parts_count
    end
  end

  context 'Response to send command with multiple phone numbers' do

    setup do
      @message_id1, @phone1 = random_string, random_phone
      @message_id2, @phone2 = random_string, random_phone
      @text = random_string
      @parts_count = 1 + rand(3)
      @hash = { 'message_id' => { @message_id1 => @phone1, @message_id2 => @phone2 }, 'sent_text' => @text, 'parts_count' => @parts_count }
      @response = TextMagic::API::Response.send(@hash, false)
    end

    should 'be a hash' do
      @response.class.should == Hash
    end

    should 'have phone numbers as keys' do
      @response.keys.sort.should == [@phone1, @phone2].sort
    end

    should 'have message ids as values' do
      @response[@phone1].should == @message_id1
      @response[@phone2].should == @message_id2
    end

    should 'have sent_text' do
      @response.sent_text.should == @text
    end

    should 'have parts_count' do
      @response.parts_count.should == @parts_count
    end
  end

  context 'Response to message_status command with single id' do

    setup do
      @text = random_string
      @status = random_string
      @reply_number = random_phone
      @created_time = (Time.now - 30).to_i
      @completed_time = (Time.now - 20).to_i
      @credits_cost = 0.01 * rand(300)
      @hash = {
        '141421' => {
          'text' => @text,
          'status' => @status,
          'created_time' => @created_time.to_s,
          'reply_number' => @reply_number,
          'completed_time' => @completed_time.to_s,
          'credits_cost' => @credits_cost
        }
      }
      @response = TextMagic::API::Response.message_status(@hash, true)
    end

    should 'equal to the message status' do
      @response.should == @status
    end

    should 'have text' do
      @response.text.should == @text
    end

    should 'have created_time' do
      @response.created_time.should == Time.at(@created_time)
    end

    should 'have completed_time' do
      @response.completed_time.should == Time.at(@completed_time)
    end

    should 'have reply_number' do
      @response.reply_number.should == @reply_number
    end

    should 'have credits_cost' do
      @response.credits_cost.should be_close(@credits_cost, 1e-10)
    end
  end
  
  context 'Response to message_status command with multiple ids' do

    setup do
      @text = random_string
      @status = random_string
      @reply_number = random_phone
      @created_time = (Time.now - 30).to_i
      @completed_time = (Time.now - 20).to_i
      @credits_cost = 0.01 * rand(300)
      @hash = {
        '141421' => {
          'text' => @text,
          'status' => @status,
          'created_time' => @created_time,
          'reply_number' => @reply_number,
          'completed_time' => @completed_time,
          'credits_cost' => @credits_cost
        }
      }
      @response = TextMagic::API::Response.message_status(@hash, false)
    end

    should 'be a hash' do
      @response.class.should == Hash
    end

    should 'have message_ids as keys' do
      @response.keys.should == ['141421']
    end

    should 'contain statuses' do
      @response.values.first.should == @status
    end

    should 'have text for all statuses' do
      @response.values.first.text.should == @text
    end

    should 'have created_time for all statuses' do
      @response.values.first.created_time.should == Time.at(@created_time)
    end

    should 'have completed_time for all statuses' do
      @response.values.first.completed_time.should == Time.at(@completed_time)
    end

    should 'have reply_number for all statuses' do
      @response.values.first.reply_number.should == @reply_number
    end

    should 'have credits_cost for all statuses' do
      @response.values.first.credits_cost.should be_close(@credits_cost, 1e-10)
    end
  end

  context 'Response to receive command' do

    setup do
      @timestamp = (Time.now - 30).to_i
      @text, @phone, @message_id = random_string, random_phone, random_string
      @message = {
        'timestamp' => @timestamp,
        'from' => @phone,
        'text' => @text,
        'message_id' => @message_id
      }
      @unread = rand(1e4)
      @hash = { 'unread' => @unread, 'messages' => [@message] }
      @response = TextMagic::API::Response.receive(@hash)
    end

    should 'have unread' do
      @response.unread.should == @unread
    end

    should 'be an array' do
      @response.class.should == Array
    end

    should 'contain strings with phones numbers and texts' do
      @response.first.should == "#{@phone}: #{@text}"
    end

    should 'have timestamp for all messages' do
      @response.first.timestamp.should == Time.at(@timestamp)
    end

    should 'have from for allmessages' do
      @response.first.from.should == @phone
    end

    should 'have text for all messages' do
      @response.first.text.should == @text
    end

    should 'have message_id for all messages' do
      @response.first.message_id.should == @message_id
    end
  end
end