require 'spec_helper'

module Lumberg
  describe Whm::Reseller do
    before(:each) do
      @login    = { host: @whm_host, hash: @whm_hash }
      @whm      = Whm::Server.new(@login.dup)
      @reseller = Whm::Reseller.new(server: @whm)
    end

    describe "#setup_reseller" do
      use_vcr_cassette "whm/reseller/setupreseller"

      it "fails when the user doesn't exist" do
        result = @reseller.create(username: 'invalid')
        result[:success].should be_false
        result[:message].should match(/does not exist/i)
      end

      it "creates a reseller" do
        result = @reseller.create(username: 'bob')
        result[:success].should be_true
      end

      it "accepts makeowner option" do
        @reseller.server.should_receive(:perform_request).with('setupreseller', hash_including(makeowner: true))
        @reseller.create(username: 'bob', makeowner: true)
      end
    end

    describe "#list" do
      use_vcr_cassette "whm/reseller/listresellers"

      it "lists all resellers" do
        result = @reseller.list
        result[:success].should be_true
        result[:params][:resellers].should have(2).resellers
        result[:params][:resellers].should include('bob', 'ted')
      end
    end

    describe "#setresellerips" do
      use_vcr_cassette "whm/reseller/setresellerips"

      it "adds the ip address to the reseller account" do
        result = @reseller.add_ips(username: 'bob', ips:'192.1.2.3')
        result[:message].should match(/Successfully configured IP addresses delegation to reseller/i)
      end

      it "returns an error for invalid ip addresses" do
        result = @reseller.add_ips(username: 'bob', ips:'1.2.3.4')
        result[:message].should match(/The list of supplied IP addresses contains inappropriate values/i)
      end
    end

    describe "#setresellerlimits" do
      use_vcr_cassette "whm/reseller/setresellerlimits"

      it "sets the limits" do
        result = @reseller.set_limits(username: 'bob', diskspace_limit: 1024, enable_overselling: true,
                                      enable_overselling_diskspace: true)
        result[:success].should be_true
        result[:message].should match(/Successfully set reseller account .*limits/i)
      end
    end

    describe "#terminate" do
      use_vcr_cassette "whm/reseller/terminatereseller"

      it "terminates the reseller" do
        result = @reseller.terminate(reseller: 'terminat')
        result[:success].should be_true
        result[:message].should match(/account terminations complete/i)
        result[:params][:accts].should be_empty
      end

      it "terminates the main account" do
        result = @reseller.terminate(reseller: 'terminat', terminatereseller: true)
        result[:success].should be_true
        result[:message].should match(/account terminations complete/i)
        result[:params][:accts][:terminat][:rawout].should match(/Account Removal Complete/i)
      end

      it "errors on non-existaet user" do
        result = @reseller.terminate(reseller: 'what')
        result[:success].should be_false
        result[:message].should match(/does not exist/i)
      end

    end

    describe "#setresellermainip" do
      use_vcr_cassette "whm/reseller/setresellermainip"

      it "sets the main ip" do
        result = @reseller.set_main_ip(username: 'bob', ip: '192.1.2.3')
        result[:success].should be_true
        result[:message].should match(/Successfully set main IP address of the reseller/i)
      end

      it "returns an error when the IP is invalid" do
        result = @reseller.set_main_ip(username: 'bob', ip: '10')
        result[:success].should be_false
        result[:message].should match(/Supplied IP address is invalid/)
      end

      it "returns an error when the user is invalid" do
        result = @reseller.set_main_ip(username: 'notexists', ip: '192.1.2.3')
        result[:success].should be_false
        result[:message].should match(/Specified user is not a reseller/i)
      end
    end

    describe "#setresellerpackagelimit" do
      use_vcr_cassette "whm/reseller/setresellerpackagelimit"

      it "sets the package limit" do
        result = @reseller.set_package_limit(username: 'bob', no_limit: false, package: 'gold', allowed: true)
        result[:success].should be_true
        result[:message].should match(/Successfully set reseller package limit/i)
      end

      it "sets no limit" do
        result = @reseller.set_package_limit(username: 'bob', no_limit: true, package: 'gold')
        result[:success].should be_true
        result[:message].should match(/Successfully set reseller package limit/i)
      end
    end

    describe "#suspendreseller" do
      use_vcr_cassette "whm/reseller/suspendreseller"

      it "suspends the reseller" do
        result = @reseller.suspend(username: 'bob')
        result[:success].should be_true
        result[:message].should match(/Finished suspending reseller/i)
      end

      it "can take a reason" do
        result = @reseller.suspend(username: 'bob', reason: 'some reason')
        result[:success].should be_true
        result[:message].should match(/Finished suspending reseller/i)
      end

      it "returns an error when the user is invalid" do
        result = @reseller.suspend(username: 'notexists')
        result[:success].should be_false
        result[:message].should match(/Specified user is not a reseller/i)
      end
    end

    describe "#unsuspendreseller" do
      use_vcr_cassette "whm/reseller/unsuspendreseller"

      it "should unsuspend the user" do
        result = @reseller.unsuspend(username: 'bob')
        result[:success].should be_true
        result[:message].should match(/Finished unsuspending reseller/i)
      end

      it "return an error when the user is invalid" do
        result = @reseller.unsuspend(username: 'notexists')
        result[:success].should be_false
        result[:message].should match(/Specified user is not a reseller/i)
      end
    end

    describe "#acctcounts" do
      use_vcr_cassette "whm/reseller/acctcounts"

      it "returns the account counts" do
        result = @reseller.account_counts(username: 'bob')
        result[:success].should be_true
        result[:message].should match(/Obtained reseller account counts/i)
        result[:params][:account].should == "bob"
        result[:params][:suspended].to_i.should == 0
        result[:params][:active].to_i.should == 0
        result[:params][:limit].should == ""
      end

      it "returns an error when the user is invalid" do
        result = @reseller.account_counts(username: 'notexists')
        result[:success].should be_false
        result[:message].should match(/Specified user is not a reseller/i)
      end
    end

    describe "#setresellernameservers" do
      use_vcr_cassette "whm/reseller/setresellernameservers"

      it "sets the default nameservers" do
        result = @reseller.set_nameservers(username: 'bob')
        result[:success].should be_true
        result[:message].should match(/Set resellers nameservers/i)
      end

      it "sets the specified nameservers" do
        result = @reseller.set_nameservers(username: 'bob', nameservers: 'ns1.example.com')
        result[:success].should be_true
        result[:message].should match(/Set resellers nameservers/i)
      end

      it "returns an error for an invalid username" do
        result = @reseller.account_counts(username: 'notexists')
        result[:success].should be_false
        result[:message].should match(/Specified user is not a reseller/i)
      end
    end

    describe "#resellerstats" do
      use_vcr_cassette "whm/reseller/resellerstats"

      it "returns the stats of the reseller" do
        result = @reseller.stats(reseller: 'bob')
        result[:success].should be_true
        result[:message].should match(/Fetched Reseller Data OK/i)
        result[:params][:diskquota].to_i.should == 0
        result[:params][:diskoverselling].to_i.should == 1
        result[:params][:bandwidthlimit].to_i.should == 0
      end

      it "returns an error for an invalid reseller" do
        result = @reseller.stats(reseller: 'notexists')
        result[:success].should be_false
        result[:message].should match(/Reseller Does Not Exist/i)
      end
    end

    describe "#list_acls" do
      use_vcr_cassette "whm/reseller/listacls"

      it "lists the saved reseller ACL lists" do
        result = @reseller.list_acls
        result[:params].size.should == 1
        result[:params][:testacllist][:add_pkg].to_i.should == 1
        result[:params][:testacllist][:add_pkg_ip].to_i.should == 1
        result[:params][:testacllist][:edit_mx].to_i.should == 0
      end
    end

    describe "#saveacllist" do
      use_vcr_cassette "whm/reseller/saveacllist"

      it "creates a new reseller ACL list" do
        result = @reseller.save_acl_list(acllist: 'testacllist')
        result[:success].should be_true
        result[:message].should match(/ACL List testacllist saved/i)
      end

      it "creates a new reseller ACL list with optional settings" do
        result = @reseller.save_acl_list(acllist: 'testacllist',
                                         "acl-ssl".to_sym => true,
                                         "acl-add-pkg".to_sym => true,
                                         "acl-stats".to_sym => true)
        result[:success].should be_true
        result[:message].should match(/ACL List testacllist saved/i)
      end
    end

    describe "#setacls" do
      use_vcr_cassette "whm/reseller/setacls"

      it "sets the ACL for the reseller" do
        result = @reseller.set_acls(reseller: 'bob', acllist: 'testacllist')
        result[:success].should be_true
        result[:message].should match(/Reseller Acls Saved/i)
      end

      it "returns an error for an invalid reseller" do
        result = @reseller.set_acls(reseller: 'notexists')
        result[:success].should be_false
        result[:message].should match(/Not a reseller/i)
      end
    end

    describe "#unsetupreseller" do
      use_vcr_cassette "whm/reseller/unsetupreseller"

      it "removes the reseller status from the user" do
        result = @reseller.unsetup(username: 'bob')
        result[:success].should be_true
      end

      it "returns an error if the user does not exist" do
        result = @reseller.unsetup(username: 'notexists')
        result[:success].should be_false
        result[:message].should match(/called for a user that does not exist/i)
      end
    end
  end
end
