require 'test_helper'

module Workarea
  class CategorizationTest < IntegrationTest
    setup :set_product

    def set_product
      @product = create_product(name: 'Foo')
    end

    def test_includes_categories_from_manual_placement
      category_one = create_category(product_ids: [@product.id])
      category_two = create_category(product_ids: [@product.id])

      categorization = Categorization.new(@product)
      assert_includes(categorization, category_one.id.to_s)
      assert_includes(categorization, category_two.id.to_s)
    end

    def test_includes_rule_based_categories
      category_one = create_category(
        product_rules: [{ name: 'search', operator: 'equals', value: 'foo' }]
      )

      category_two = create_category(
        product_rules: [{ name: 'search', operator: 'equals', value: 'foo' }]
      )

      categorization = Categorization.new(@product)
      assert_includes(categorization, category_one.id.to_s)
      assert_includes(categorization, category_two.id.to_s)
    end

    def test_default_uses_the_oldest_active_category
      category_one = create_category(
        product_ids: [@product.id],
        created_at: 1.day.ago
      )

      create_category(
        product_ids: [@product.id],
        created_at: 2.hours.ago
      )

      create_category(
        product_ids: [@product.id],
        created_at: 3.hours.ago,
        active: false
      )

      create_category(
        product_ids: [@product.id]
      )

      categorization = Categorization.new(@product)
      assert_equal(category_one.id, categorization.default)
    end

    def test_manual_default
      category_one = create_category(
        product_ids: [@product.id],
        created_at: 2.hours.ago
      )
      category_two = create_category

      @product.update_attributes(default_category_id: category_two.id)

      categorization = Categorization.new(@product)
      assert_equal(category_one.id, categorization.default)

      category_two.update_attributes(product_ids: [@product.id])

      categorization = Categorization.new(@product)
      assert_equal(category_two.id, categorization.default)

      category_two.update_attributes(active: false)

      categorization = Categorization.new(@product)
      assert_equal(category_one.id, categorization.default)
    end

    def test_null_object
      categorization = Categorization.new
      assert_equal(0, categorization.size)
      assert_equal([], categorization.to_models)
    end
  end
end