require "spec_helper"

describe CrowdRest::Session do
  shared_examples "a failed request" do
    it "includes a failure reason in the response" do
      @response.reason.should_not be_nil
    end
    
    it "includes a failure message in the response" do
      @response.message.should_not be_nil
    end
  end    
  
  describe ".create" do
    context "given valid user credentials" do
      before(:all) do
        @response = CrowdRest::Session.create("crowduser", "crowdpass")
      end
      
      it "creates a new session" do
        @response.code.should == 201
      end

      it "includes the sso token in the response" do
        @response.token.should_not be_nil
      end
    end

    context "given invalid user credentials" do
      before(:all) do
        @response = CrowdRest::Session.create("baduser", "badpass")
      end

      it_behaves_like "a failed request"
      
      it "does not create a new session" do
        @response.code.should_not == 201
      end
    end
  end
  
  describe ".find(token)" do
    context "given a valid session token" do
      before(:all) do
        login = CrowdRest::Session.create("crowduser", "crowdpass")
        @response = CrowdRest::Session.find(login.token)
      end
      
      it "responds successfuly" do
        @response.code.should == 200
      end
    end
    
    context "given an invalid session token" do
      before(:all) do
        @response = CrowdRest::Session.find("beefface")
      end
      
      it_behaves_like "a failed request"

      it "does not respond successfuly" do
        @response.code.should_not == 200
      end
    end
  end
  
  describe ".find(token, :include => :user)" do
    before(:all) do
      login = CrowdRest::Session.create("crowduser", "crowdpass")
      @response = CrowdRest::Session.find(login.token, :include => :user)
    end
    
    it "includes a crowd user in the response" do
      @response.user.should_not be_nil
      @response.user.should be_a(CrowdRest::User)
    end
  end

  describe ".validate(token)" do
    context "given a valid session token" do
      before(:all) do
        login = CrowdRest::Session.create("crowduser", "crowdpass")
        @response = CrowdRest::Session.validate(login.token)
      end

      it "responds successfully" do
        @response.code.should == 200
      end
    end

    context "given an invalid session token" do
      before(:all) do
        @response = CrowdRest::Session.validate("beefface")
      end

      it_behaves_like "a failed request"

      it "does not respond successfuly" do
        @response.code.should == 404
      end
    end
  end

  describe ".invalidate(token)" do
    context "given a valid session token" do
      before(:all) do
        login = CrowdRest::Session.create("crowduser", "crowdpass")
        @response = CrowdRest::Session.invalidate(login.token)
      end

      it "responds successfully" do
        @response.code.should == 204
      end
    end

    context "given an invalid session token" do
      before(:all) do
        @response = CrowdRest::Session.invalidate("beefface")
      end

      it "responds successfully" do
        @response.code.should == 204
      end
    end
  end

  describe ".destroy(username)" do
    context "given a valid username" do
      before(:all) do
        login = CrowdRest::Session.create("crowduser", "crowdpass")
        @response = CrowdRest::Session.destroy("crowduser")
      end

      it "responds successfully" do
        @response.code.should == 204
      end
    end

    context "given an invalid username" do
      before(:all) do
        @response = CrowdRest::Session.destroy("beefface")
      end

      it "does not respond successfully" do
        @response.code.should == 404
      end
    end
  end
end