require "test_helper"

class SiteChild < Site
  meta_attribute :theme, type: :string
  meta_attribute :contact_phone, type: :string
end

class SiteChild1 < Site
  meta_attribute "basic.theme", type: :string
  meta_attribute "basic.allow_register", type: :bool
  meta_attribute "advanced.disable_login", type: :bool
end

class SiteChild2 < Site
  section "basic" do
    meta_attribute "theme", type: :string
    meta_attribute "allow_register", type: :bool
  end
  section "advanced" do
    meta_attribute "disable_login", type: :bool
  end

  section "seo" do
    meta_attribute "meta.keywords", type: :string
    meta_attribute "meta.description", type: :string
    meta_attribute "advanced.password", type: :string
  end
end

class SiteTest < ActiveSupport::TestCase
  setup do
    @site = Site.new(name: "Demo Site 1", preferences: {show_email: true, allow_pm: false})
  end

  test "should be valid" do
    assert @site.valid?
  end

  test "should save site" do
    assert @site.save
    expect_value = {"show_email" => true, "allow_pm" => false}
    assert_equal expect_value, @site.preferences
    assert_equal nil, @site.preferences[:show_email]
    assert_equal true, @site.preferences["show_email"]
    assert_equal false, @site.preferences["allow_pm"]
  end

  test "should load from db" do
    @site_one = sites(:one)
    assert_equal false, @site_one.new_record?
    expect_value = {"allow_pm" => "false", "show_email" => true}
    assert_equal expect_value, @site_one.preferences
  end

  test "should raise error if assign invalid type to preferences" do
    @site1 = Site.new(name: "Demo Site 2")
    @site1.preferences = "Invalid type"
    assert_equal "Invalid type", @site1.preferences # To fix
  end

  test "meta_attribute method should work" do
    @site_child = SiteChild.new(name: "test_field_0")
    @site_child.theme = "photonicat"
    @site_child.contact_phone = "8613500001111"
    assert_equal true, @site_child.save
    expect_value = {"theme" => {"value" => "photonicat"}, "contact_phone" => {"value" => "8613500001111"}}
    assert_equal expect_value, @site_child.preferences

    @site_from_db = SiteChild.where(name: "test_field_0").first

    assert_equal "photonicat", @site_from_db.theme
    assert_equal "8613500001111", @site_from_db.contact_phone
  end

  test "meta_attribute module should make sections work" do
    @site_child = SiteChild1.new(name: "test_field_1")
    assert_equal ["basic", "advanced"], @site_child.sections
  end

  test "meta_attribute module should make section work" do
    @site_child = SiteChild2.new(name: "test_field_2")
    assert_equal ["basic", "advanced", "seo.meta", "seo.advanced"], @site_child.sections
    assert_equal ["basic", "advanced", "seo.meta", "seo.advanced"], SiteChild2.sections
  end
end
