# frozen_string_literal: true
require "swagger_helper"

RSpec.describe "categories" do
  let(:admin) { Fabricate(:admin) }
  let!(:category) { Fabricate(:category, user: admin) }

  before do
    Jobs.run_immediately!
    sign_in(admin)
  end

  path "/categories.json" do
    post "Creates a category" do
      tags "Categories"
      operationId "createCategory"
      consumes "application/json"
      expected_request_schema = load_spec_schema("category_create_request")
      parameter name: :params, in: :body, schema: expected_request_schema

      produces "application/json"
      response "200", "success response" do
        expected_response_schema = load_spec_schema("category_create_response")
        schema expected_response_schema

        let(:params) { { "name" => "todo" } }

        it_behaves_like "a JSON endpoint", 200 do
          let(:expected_response_schema) { expected_response_schema }
          let(:expected_request_schema) { expected_request_schema }
        end
      end
    end

    get "Retrieves a list of categories" do
      tags "Categories"
      operationId "listCategories"
      consumes "application/json"
      expected_request_schema = nil
      parameter name: :include_subcategories, in: :query, schema: { type: :boolean, enum: [true] }

      produces "application/json"
      response "200", "success response" do
        expected_response_schema = load_spec_schema("category_list_response")
        schema expected_response_schema

        let(:include_subcategories) { true }

        it_behaves_like "a JSON endpoint", 200 do
          let(:expected_response_schema) { expected_response_schema }
          let(:expected_request_schema) { expected_request_schema }
        end
      end
    end
  end

  path "/categories/{id}.json" do
    put "Updates a category" do
      tags "Categories"
      operationId "updateCategory"
      consumes "application/json"
      expected_request_schema = load_spec_schema("category_create_request")
      parameter name: :id, in: :path, schema: { type: :integer }
      parameter name: :params, in: :body, schema: expected_request_schema

      produces "application/json"
      response "200", "success response" do
        expected_response_schema = load_spec_schema("category_update_response")
        schema expected_response_schema

        let(:id) { category.id }
        let(:params) { { "name" => "todo" } }

        it_behaves_like "a JSON endpoint", 200 do
          let(:expected_response_schema) { expected_response_schema }
          let(:expected_request_schema) { expected_request_schema }
        end
      end
    end
  end

  path "/c/{slug}/{id}.json" do
    get "List topics" do
      tags "Categories"
      operationId "listCategoryTopics"
      produces "application/json"
      parameter name: :slug, in: :path, schema: { type: :string }
      parameter name: :id, in: :path, schema: { type: :integer }
      expected_request_schema = nil

      produces "application/json"
      response "200", "success response" do
        expected_response_schema = load_spec_schema("category_topics_response")
        schema expected_response_schema

        let(:id) { category.id }
        let(:slug) { category.slug_path.join("/") }

        it_behaves_like "a JSON endpoint", 200 do
          let(:expected_response_schema) { expected_response_schema }
          let(:expected_request_schema) { expected_request_schema }
        end
      end
    end
  end

  path "/c/{id}/show.json" do
    get "Show category" do
      tags "Categories"
      operationId "getCategory"
      consumes "application/json"
      parameter name: :id, in: :path, schema: { type: :integer }
      expected_request_schema = nil

      produces "application/json"
      response "200", "response" do
        expected_response_schema = load_spec_schema("category_create_response")
        schema expected_response_schema

        let(:id) { category.id }

        it_behaves_like "a JSON endpoint", 200 do
          let(:expected_response_schema) { expected_response_schema }
          let(:expected_request_schema) { expected_request_schema }
        end
      end
    end
  end
end