require 'dock_health_api'
require 'spec_helper'

RSpec.describe DockHealthApi::Webhook do

  params = { "url": "https://www.funbar.com",
             "secret": "b" * 36,
             "events": ["CREATE_TASK"]
            }
  id = ""

  describe "#create" do
    context "Add new webhook" do
      it "should add new webhook" do
        initial_count = DockHealthApi::Webhook.list.count
        response = DockHealthApi::Webhook.create(params)
        final_count = DockHealthApi::Webhook.list.count
        expect(response["url"]).to eq(params[:url])
        expect(final_count - initial_count).to eq(1)
        id = response["id"]
      end
    end

    context "Add webhook with same url" do
      it "should return 400" do
        initial_count = DockHealthApi::Webhook.list.count
        response = DockHealthApi::Webhook.create(params)
        final_count = DockHealthApi::Webhook.list.count
        expect(response["status"]).to eq(400)
        expect(final_count - initial_count).to eq(0)
      end
    end

    context "Add webhook with bad params" do
      it "should return 400" do
        bad_params = { "url": "https://www.nofunbar.com",
                       "secret": "b" * 36,
                       "id": id
                     }
        initial_count = DockHealthApi::Webhook.list.count
        response = DockHealthApi::Webhook.create(bad_params)
        final_count = DockHealthApi::Webhook.list.count
        expect(response["status"]).to eq(400)
        expect(final_count - initial_count).to eq(0)
      end
    end
  end

  describe "#list" do
    context "list all webhook" do
      it "should list all webhook" do
        response = DockHealthApi::Webhook.list
        expect(response.first.is_a?(DockHealthApi::Webhook))
      end
    end

    context "list specific webhook" do
      it "should return the correct webhook" do
        response = DockHealthApi::Webhook.list(url: params[:url])
        expect(response.first["url"]).to eq(params[:url])
      end
    end

  end

  describe "#get" do
    context "get a specific webhook" do
      it "should get the correct webhook" do
        response = DockHealthApi::Webhook.get(id)
        expect(response["url"]).to eq(params[:url])
      end
    end

    context "get webhook with invalid id" do
      it "should return 400" do
        invalid_id = "123"
        response = DockHealthApi::Webhook.get(invalid_id)
        expect(response["status"]).to eq(400)
      end
    end

    context "get webhook with wrong id" do
      it "should return 404" do
        wrong_id = "a" * 36
        response = DockHealthApi::Webhook.get(wrong_id)
        expect(response["status"]).to eq(404)
      end
    end
  end

  describe "#update" do
    context "update an existing webhook" do
      it "should update an exiting webhook" do
        new_params = { "url": "https://www.nofunbar.com",
                       "secret": "b" * 36,
                       "events": ["CREATE_TASK"],
                       "id": id
                     }
        response = DockHealthApi::Webhook.put(new_params)
        expect(response["url"]).to eq(new_params[:url])
      end
    end
  end

  describe "#delete" do
    context "Delete existing webhook" do
      it "should delete existing webhook" do
        initial_count = DockHealthApi::Webhook.list.count
        response = DockHealthApi::Webhook.delete(id: id)
        final_count = DockHealthApi::Webhook.list.count
        expect(response["enabled"]).to be false
        expect(final_count - initial_count).to eq(-1)
      end
    end
  end

end