# frozen_string_literal: true

require "import_export"

RSpec.describe ImportExport::Importer do
  before { STDOUT.stubs(:write) }

  let(:import_data) do
    import_file = Rack::Test::UploadedFile.new(file_from_fixtures("import-export.json", "json"))
    ActiveSupport::HashWithIndifferentAccess.new(JSON.parse(import_file.read))
  end

  def import(data)
    ImportExport::Importer.new(data).perform
  end

  describe ".perform" do
    it "topics and users" do
      data = import_data.dup
      data[:categories] = nil
      data[:groups] = nil

      expect { import(data) }.to not_change { Category.count }.and not_change {
              Group.count
            }.and change { Topic.count }.by(2).and change { User.count }.by(2)
    end

    context "with categories and groups" do
      it "works" do
        data = import_data.dup
        data[:topics] = nil
        data[:users] = nil

        expect { import(data) }.to change { Category.count }.by(6).and change { Group.count }.by(
                2,
              ).and change { Topic.count }.by(6).and not_change { User.count }
      end

      it "works with sub-sub-categories" do
        data = import_data.dup

        # 11 -> 10 -> 15
        data[:categories].find { |c| c[:id] == 10 }[:parent_category_id] = 11
        data[:categories].find { |c| c[:id] == 15 }[:parent_category_id] = 10

        expect { import(data) }.to change { Category.count }.by(6).and change {
                SiteSetting.max_category_nesting
              }.from(2).to(3)
      end

      it "fixes permissions" do
        data = import_data.dup
        data[:categories].find { |c| c[:id] == 10 }[:permissions_params] = { custom_group: 1 }
        data[:categories].find { |c| c[:id] == 15 }[:permissions_params] = { staff: 1 }

        permissions = data[:categories].find { |c| c[:id] == 10 }[:permissions_params]

        expect { import(data) }.to change { Category.count }.by(6).and change {
                permissions[:staff]
              }.from(nil).to(1)
      end
    end

    it "categories, groups and users" do
      data = import_data.dup
      data[:topics] = nil

      expect { import(data) }.to change { Category.count }.by(6).and change { Group.count }.by(
              2,
            ).and change { Topic.count }.by(6).and change { User.count }.by(2)
    end

    it "groups" do
      data = import_data.dup
      data[:categories] = nil
      data[:topics] = nil
      data[:users] = nil

      expect { import(data) }.to not_change { Category.count }.and change { Group.count }.by(
              2,
            ).and not_change { Topic.count }.and not_change { User.count }
    end

    it "all" do
      expect { import(import_data) }.to change { Category.count }.by(6).and change {
              Group.count
            }.by(2).and change { Topic.count }.by(8).and change { User.count }.by(2).and change {
                                TranslationOverride.count
                              }.by(1)
    end
  end
end