# typed: true
# frozen_string_literal: true

require "extend/pathname/write_mkpath_extension"

# Use a copy of Pathname with the WriteMkpathExtension prepended to avoid affecting the original class for all tests
class PathnameCopy < Pathname
  PathnameCopy.prepend WriteMkpathExtension
end

RSpec.describe WriteMkpathExtension do
  let(:file_content) { "sample contents" }

  it "creates parent directories if they do not exist" do
    mktmpdir do |tmpdir|
      file = PathnameCopy.new(tmpdir/"foo/bar/baz.txt")
      expect(file.dirname).not_to exist
      file.write(file_content)
      expect(file).to exist
      expect(file.read).to eq(file_content)
    end
  end

  it "raises if file exists and not in append mode or with offset" do
    mktmpdir do |tmpdir|
      file = PathnameCopy.new(tmpdir/"file.txt")
      file.write(file_content)
      expect { file.write("new content") }.to raise_error(RuntimeError, /Will not overwrite/)
    end
  end

  it "allows overwrite if offset is provided" do
    mktmpdir do |tmpdir|
      file = PathnameCopy.new(tmpdir/"file.txt")
      file.write(file_content)
      expect do
        file.write("change", 0)
      end.not_to raise_error
      expect(file.read).to eq("change contents")
    end
  end

  it "allows append mode ('a')" do
    mktmpdir do |tmpdir|
      file = PathnameCopy.new(tmpdir/"file.txt")
      file.write(file_content)
      expect do
        file.write(" appended", mode: "a")
      end.not_to raise_error
      expect(file.read).to eq("#{file_content} appended")
    end
  end

  it "allows append mode ('a+')" do
    mktmpdir do |tmpdir|
      file = PathnameCopy.new(tmpdir/"file.txt")
      file.write(file_content)
      expect do
        file.write(" again", mode: "a+")
      end.not_to raise_error
      expect(file.read).to include("again")
    end
  end
end
