require File.expand_path("../spec_helper", __FILE__)

describe Keen do
  describe "default client" do
    describe "configuring from the environment" do
      before do
        Keen.instance_variable_set(:@default_client, nil)
        ENV["KEEN_PROJECT_ID"] = "12345"
        ENV["KEEN_WRITE_KEY"] = "abcdewrite"
        ENV["KEEN_READ_KEY"] = "abcderead"
        ENV["KEEN_MASTER_KEY"] = "lalalala"
        ENV["KEEN_API_URL"] = "http://fake.keen.io:fakeport"
        ENV["KEEN_PROXY_URL"] = "http://proxy.keen.io:proxyport"
        ENV["KEEN_PROXY_TYPE"] = "http"
      end

      let(:client) { Keen.send(:default_client) }

      it "should set a project id from the environment" do
        client.project_id.should == "12345"
      end

      it "should set a write key from the environment" do
        client.write_key.should == "abcdewrite"
      end

      it "should set a read key from the environment" do
        client.read_key.should == "abcderead"
      end

      it "should set a master key from the environment" do
        client.master_key.should == "lalalala"
      end

      it "should set an api host from the environment" do
        client.api_url.should == "http://fake.keen.io:fakeport"
      end

      it "should set an proxy host from the environment" do
        client.proxy_url.should == "http://proxy.keen.io:proxyport"
      end

      it "should set an proxy type from the environment" do
        client.proxy_type.should == "http"
      end
    end
  end

  describe "Keen delegation" do
    it "should memoize the default client, retaining settings" do
      Keen.project_id = "new-abcde"
      Keen.project_id.should == "new-abcde"
    end

    after do
      Keen.instance_variable_set(:@default_client, nil)
    end
  end

  describe "forwardable" do
    before do
      @default_client = double("client")
      Keen.stub(:default_client).and_return(@default_client)
    end

    [:project_id, :write_key, :read_key, :api_url, :proxy_url, :proxy_type].each do |_method|
      it "should forward the #{_method} method" do
        @default_client.should_receive(_method)
        Keen.send(_method)
      end
    end

    [:project_id, :write_key, :read_key, :master_key, :api_url].each do |_method|
      it "should forward the #{_method} method" do
        @default_client.should_receive(_method)
        Keen.send(_method)
      end
    end

    [:project_id=, :write_key=, :read_key=, :master_key=, :api_url=].each do |_method|
      it "should forward the #{_method} method" do
        @default_client.should_receive(_method).with("12345")
        Keen.send(_method, "12345")
      end
    end

    [:publish, :publish_async, :publish_batch].each do |_method|
      it "should forward the #{_method} method" do
        @default_client.should_receive(_method).with("users", {})
        Keen.send(_method, "users", {})
      end
    end

    # pull the query methods list at runtime in order to ensure
    # any new methods have a corresponding delegator
    Keen::Client::QueryingMethods.instance_methods.each do |_method|
      it "should forward the #{_method} query method" do
        @default_client.should_receive(_method).with("users", {})
        Keen.send(_method, "users", {})
      end
    end
  end

  describe "logger" do
    it "should be set to info" do
      Keen.logger.level.should == Logger::INFO
    end
  end
end