#encoding: UTF-8

require 'spec_helper'

describe Egnyte::Permission do
  before(:each) do
    @valid_permission_hash = {
        "users" => {
            "david" => "Owner",
            "dpfeffer" => "Editor"
        },
        "groups" => { "Test Group" => "Editor" }
    }
    @invalid_permission_hash = {
        "blah" => { 
          "david" => "Owner", 
          "dpfeffer" => "Editor" 
        }
    }
    @lowercase_permission_hash = {
        "users" => {
            "david" => "owner",
            "dpfeffer" => "editor"
        },
        "groups" => { "Test Group" => "editor" }
    }
    @crazy_permission_hash = {
        "users" => {
            "david" => "crazy",
            "dpfeffer" => "Viewer"
        },
        "groups" => { "Test Group" => "perms" }
    }
    @valid_permission_structure_from_api = JSON.parse(File.read('./spec/fixtures/permission/permission_list.json'))
    stub_request(:get, "https://test.egnyte.com/pubapi/v1/userinfo").
             with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer access_token', 'User-Agent'=>'Ruby'}).
             to_return(:status => 200, :body => "", :headers => {})
    @session = Egnyte::Session.new({
      key: 'api_key',
      domain: 'test',
      access_token: 'access_token'
    }, :implicit, 0.0)
    @client = Egnyte::Client.new(@session)
    @permission = Egnyte::Permission.new(@valid_permission_hash)
  end

  describe "#initialize" do

    it 'instantiates a valid permission set if it has all required fields' do
      expect(@permission.valid?).to be true
      expect(@permission.has_data?).to be true
    end

    it 'raises an error if it does not have valid fields' do
      expect {Egnyte::Permission.new(@invalid_permission_hash)}.to raise_error( Egnyte::InvalidParameters ) 
    end

    it 'drops invalid permission levels' do
      @permission = Egnyte::Permission.new(@crazy_permission_hash)
      expect(@permission.data["users"]["dpfeffer"]).to eq "Viewer"
      expect(@permission.data["users"]["david"]).to be nil
    end

    it 'capitalizes the first letter of permission levels' do
      @permission = Egnyte::Permission.new(@lowercase_permission_hash)
      expect(@permission.data["users"]["david"]).to eq "Owner"
    end

    it 'can construct a valid permission listing response from the API' do
      perm = Egnyte::Permission.build_from_api_listing(@valid_permission_structure_from_api)
      expect(perm.valid?).to be true
      expect(perm.has_data?).to be true
    end

  end

  describe "#to_json" do

    it 'should render a valid json representation of a permission object' do
      expect(@permission.to_json).to eq "{\"users\":{\"david\":\"Owner\",\"dpfeffer\":\"Editor\"},\"groups\":{\"Test Group\":\"Editor\"}}"
    end

  end

  describe "#merge" do

    it 'should be able to merge two permission objects' do
      @permission.merge!({
          "users" => {
              "jsmith" => "Owner" ,
              "jdoe" => "Editor"
          }
      })
    end

  end

end