# typed: false
# frozen_string_literal: true

require "livecheck/strategy/npm"

describe Homebrew::Livecheck::Strategy::Npm do
  subject(:npm) { described_class }

  let(:npm_urls) do
    {
      typical:    "https://registry.npmjs.org/abc/-/def-1.2.3.tgz",
      org_scoped: "https://registry.npmjs.org/@example/abc/-/def-1.2.3.tgz",
    }
  end
  let(:non_npm_url) { "https://brew.sh/test" }

  let(:generated) do
    {
      typical:    {
        url:   "https://www.npmjs.com/package/abc?activeTab=versions",
        regex: %r{href=.*?/package/abc/v/(\d+(?:\.\d+)+)"}i,
      },
      org_scoped: {
        url:   "https://www.npmjs.com/package/@example/abc?activeTab=versions",
        regex: %r{href=.*?/package/@example/abc/v/(\d+(?:\.\d+)+)"}i,
      },
    }
  end

  describe "::match?" do
    it "returns true for an npm URL" do
      expect(npm.match?(npm_urls[:typical])).to be true
      expect(npm.match?(npm_urls[:org_scoped])).to be true
    end

    it "returns false for a non-npm URL" do
      expect(npm.match?(non_npm_url)).to be false
    end
  end

  describe "::generate_input_values" do
    it "returns a hash containing url and regex for an npm URL" do
      expect(npm.generate_input_values(npm_urls[:typical])).to eq(generated[:typical])
      expect(npm.generate_input_values(npm_urls[:org_scoped])).to eq(generated[:org_scoped])
    end

    it "returns an empty hash for a non-npm URL" do
      expect(npm.generate_input_values(non_npm_url)).to eq({})
    end
  end
end
