require "rails_helper"

describe "Multitenancy", :seed_tenants do
  before { create(:tenant, schema: "mars") }

  scenario "Disabled features", :no_js do
    create(:tenant, schema: "venus")
    Tenant.switch("mars") { Setting["process.debates"] = true }
    Tenant.switch("venus") { Setting["process.debates"] = nil }

    with_subdomain("mars") do
      visit debates_path

      expect(page).to have_css "#debates"
    end

    with_subdomain("venus") do
      expect { visit debates_path }.to raise_exception(FeatureFlags::FeatureDisabled)
    end
  end

  scenario "Content is different for differents tenants" do
    create(:tenant, schema: "venus")
    Tenant.switch("mars") { create(:poll, name: "Human rights for Martians?") }

    with_subdomain("mars") do
      visit polls_path

      expect(page).to have_content "Human rights for Martians?"
      expect(page).to have_css "html.tenant-mars"
      expect(page).not_to have_css "html.tenant-venus"
    end

    with_subdomain("venus") do
      visit polls_path

      expect(page).to have_content "There are no open votings"
      expect(page).to have_css "html.tenant-venus"
      expect(page).not_to have_css "html.tenant-mars"
    end
  end

  scenario "PostgreSQL extensions work for tenants" do
    Tenant.switch("mars") { login_as(create(:user)) }

    with_subdomain("mars") do
      visit new_proposal_path
      fill_in "Proposal title", with: "Use the unaccent extension in Mars"
      fill_in "Proposal summary", with: "tsvector for María the Martian"
      check "I agree to the Privacy Policy and the Terms and conditions of use"

      click_button "Create proposal"

      expect(page).to have_content "Proposal created successfully."

      click_link "No, I want to publish the proposal"

      expect(page).to have_content "You've created a proposal!"

      visit proposals_path
      click_button "Advanced search"
      fill_in "With the text", with: "Maria the Martian"
      click_button "Filter"

      expect(page).to have_content "Search results"
      expect(page).to have_content "María the Martian"
    end
  end

  scenario "Creating content in one tenant doesn't affect other tenants" do
    create(:tenant, schema: "venus")
    Tenant.switch("mars") { login_as(create(:user)) }

    with_subdomain("mars") do
      visit new_debate_path
      fill_in "Debate title", with: "Found any water here?"
      fill_in_ckeditor "Initial debate text", with: "Found any water here?"
      check "I agree to the Privacy Policy and the Terms and conditions of use"

      click_button "Start a debate"

      expect(page).to have_content "Debate created successfully."
      expect(page).to have_content "Found any water here?"
    end

    with_subdomain("venus") do
      visit debates_path

      expect(page).to have_content "Sign in"
      expect(page).not_to have_css ".debate"

      visit new_debate_path

      expect(page).to have_content "You must sign in or register to continue."
    end
  end

  scenario "Users from another tenant cannot vote" do
    create(:tenant, schema: "venus")
    Tenant.switch("mars") { create(:proposal, title: "Earth invasion") }
    Tenant.switch("venus") { login_as(create(:user)) }

    with_subdomain("venus") do
      visit proposals_path

      expect(page).to have_content "Sign out"
      expect(page).not_to have_content "Earth invasion"
    end

    with_subdomain("mars") do
      visit proposals_path

      within(".proposal", text: "Earth invasion") do
        click_button "Support"

        expect(page).to have_content "You must sign in or sign up to continue"
      end
    end
  end

  scenario "Sign up into subdomain" do
    with_subdomain("mars") do
      visit "/"
      click_link "Register"

      fill_in "Username", with: "Marty McMartian"
      fill_in "Email", with: "marty@consul.dev"
      fill_in "Password", with: "20151021"
      fill_in "Confirm password", with: "20151021"
      check "By registering you accept the terms and conditions of use"
      click_button "Register"

      expect(page).to have_content "You have been sent a message containing a verification link"

      confirm_email

      expect(page).to have_content "Your account has been confirmed."
    end
  end

  scenario "Users from another tenant can't sign in" do
    create(:tenant, schema: "venus")
    Tenant.switch("mars") { create(:user, email: "marty@consul.dev", password: "20151021") }

    with_subdomain("mars") do
      visit new_user_session_path
      fill_in "Email or username", with: "marty@consul.dev"
      fill_in "Password", with: "20151021"
      click_button "Enter"

      expect(page).to have_content "You have been signed in successfully."
    end

    with_subdomain("venus") do
      visit new_user_session_path
      fill_in "Email or username", with: "marty@consul.dev"
      fill_in "Password", with: "20151021"
      click_button "Enter"

      expect(page).to have_content "Invalid Email or username or password."
    end
  end

  scenario "Uses the right tenant after failing to sign in" do
    with_subdomain("mars") do
      visit new_user_session_path
      fill_in "Email or username", with: "wrong@consul.dev"
      fill_in "Password", with: "wrong"
      click_button "Enter"

      expect(page).to have_content "Invalid Email or username or password"
      expect(page).to have_css "html.tenant-mars"
      expect(page).not_to have_css "html.tenant-public"
    end
  end

  scenario "Shows the not found page when accessing a non-existing tenant", :show_exceptions do
    with_subdomain("jupiter") do
      visit root_path

      expect(page).to have_title "Not found"
    end
  end
end
