# frozen_string_literal: true

describe MiniSqlMultisiteConnection do

  describe "after_commit" do
    it "works for 'fake' (joinable) transactions" do
      outputString = "1"

      ActiveRecord::Base.transaction do
        outputString += "2"
        DB.exec("SELECT 1")
        ActiveRecord::Base.transaction do
          DB.exec("SELECT 2")
          outputString += "3"
          DB.after_commit { outputString += "6" }
          outputString += "4"
        end
        DB.after_commit { outputString += "7" }
        outputString += "5"
      end

      expect(outputString).to eq("1234567")
    end

    it "works for real (non-joinable) transactions" do
      outputString = "1"

      ActiveRecord::Base.transaction(requires_new: true, joinable: false) do
        outputString += "2"
        DB.exec("SELECT 1")
          ActiveRecord::Base.transaction(requires_new: true) do
            DB.exec("SELECT 2")
            outputString += "3"
            DB.after_commit { outputString += "6" }
            outputString += "4"
          end
          DB.after_commit { outputString += "7" }
          outputString += "5"
      end

      expect(outputString).to eq("1234567")
    end

    it "does not run if the transaction is rolled back" do
      outputString = "1"

      ActiveRecord::Base.transaction do
        outputString += "2"

        DB.after_commit do
          outputString += "4"
        end

        outputString += "3"

        raise ActiveRecord::Rollback
      end

      expect(outputString).to eq("123")
    end

    it "runs immediately if there is no transaction" do
      outputString = "1"

      DB.after_commit do
        outputString += "2"
      end

      outputString += "3"

      expect(outputString).to eq("123")
    end

    it "supports prepared statements" do
      DB.prepared.query("SELECT ?", 1)
      DB.prepared.query("SELECT ?", 2)
    end

  end

end