require 'shodan/query'

require 'spec_helper'
require 'has_pages_examples'
require 'page_has_hosts_examples'

describe Query do
  before(:all) do
    @query = Query.new(:query => 'ssh')
    @page = @query.first_page
  end

  it_should_behave_like "has Pages"
  it_should_behave_like "Page has Hosts"

  describe "query expression" do
    it "should support basic queries" do
      q = Query.new(:query => 'ssh')

      q.expression.should == 'ssh'
    end

    it "should support the country search operator" do
      q = Query.new(
        :query => 'ssh', :countries => [
          Countries::Mexico,
          Countries::Nicaragua
        ]
      )

      q.expression.should == 'ssh country:MX country:NI'
    end

    it "should support host search operator" do
      q = Query.new(
        :query => 'http',
        :hostnames => ['www.wired.com']
      )

      q.expression.should == 'http hostname:www.wired.com'
    end

    it "should support the net search operator" do
      q = Query.new(
        :query => 'ssh',
        :networks => ['112.0.0.0/8']
      )

      q.expression.should == 'ssh net:112.0.0.0/8'
    end

    it "should support the port search operator" do
      q = Query.new(
        :query => 'login',
        :ports => [21, 23]
      )

      q.expression.should == 'login port:21 port:23'
    end
  end

  describe "search URL" do
    before(:all) do
      @uri = @query.search_url
    end

    it "should be a valid HTTP URI" do
      @uri.class.should == URI::HTTP
    end

    it "should have a 'q' query-param" do
      @uri.query_params['q'].should == @query.query
    end
  end

  describe "page specific URLs" do
    before(:all) do
      @uri = @query.page_url(2)
    end

    it "should have a 'page' query-param" do
      @uri.query_params['page'].should == 2
    end
  end

  describe "queries from search URLs" do
    before(:all) do
      @query = Query.from_url("http://shodan.surtri.com/?q=login+port%3A21+port%3A23")
    end

    it "should have a query" do
      @query.query.should == 'login port:21 port:23'
    end
  end
end