require "rails_helper"

describe UprnDataPresenter do
  let(:presenter) { described_class.new(data) }

  describe "DPA data" do
    let(:data) do
      JSON.parse(
        '{
          "UPRN": "UPRN",
          "UDPRN": "UDPRN",
          "ADDRESS": "full address",
          "SUB_BUILDING_NAME": "0",
          "BUILDING_NAME": "building name",
          "THOROUGHFARE_NAME": "thoroughfare",
          "POST_TOWN": "posttown",
          "POSTCODE": "postcode",
          "STATUS": "APPROVED",
          "DOUBLE_DEPENDENT_LOCALITY": "double dependent locality",
          "DEPENDENT_LOCALITY": "dependent locality",
          "CLASSIFICATION_CODE": "classification code",
          "LOCAL_CUSTODIAN_CODE_DESCRIPTION": "LONDON BOROUGH OF HARINGEY",
          "BLPU_STATE_CODE": "2",
          "BLPU_STATE_CODE_DESCRIPTION": "In use",
          "LAST_UPDATE_DATE": "31/07/2020",
          "ENTRY_DATE": "30/01/2015",
          "BLPU_STATE_DATE": "30/01/2015",
          "LANGUAGE": "EN",
          "MATCH_DESCRIPTION": "EXACT"
        }',
      )
    end

    describe "#postcode" do
      it "returns postcode" do
        expect(presenter.postcode).to eq("postcode")
      end
    end

    describe "#address_line1" do
      it "returns address_line1" do
        expect(presenter.address_line1).to eq("0, Building Name, Thoroughfare")
      end
    end

    describe "#address_line2" do
      it "returns address_line2" do
        expect(presenter.address_line2).to eq("Double Dependent Locality, Dependent Locality")
      end
    end

    describe "#town_or_city" do
      it "returns town_or_city" do
        expect(presenter.town_or_city).to eq("Posttown")
      end
    end

    context "when address_line2 fields are missing" do
      let(:data) { {} }

      describe "#address_line2" do
        it "returns nil" do
          expect(presenter.address_line2).to be_nil
        end
      end
    end
  end

  describe "LPI data" do
    let(:data) do
      JSON.parse(
        '{
          "UPRN": "UPRN",
          "ADDRESS": "flat 1, 22, street name, posttown, postcode",
          "SAO_TEXT": "flat 1",
          "PAO_START_NUMBER": "22",
          "STREET_DESCRIPTION": "street name",
          "TOWN_NAME": "posttown",
          "POSTCODE_LOCATOR": "postcode",
          "LPI_KEY": "LPI_KEY"
        }',
      )
    end

    describe "#postcode" do
      it "returns postcode" do
        expect(presenter.postcode).to eq("postcode")
      end
    end

    describe "#address_line1" do
      it "returns address_line1" do
        expect(presenter.address_line1).to eq("Flat 1, 22, Street Name")
      end
    end

    describe "#address_line2" do
      it "returns address_line2" do
        expect(presenter.address_line2).to be_nil
      end
    end

    describe "#town_or_city" do
      it "returns town_or_city" do
        expect(presenter.town_or_city).to eq("Posttown")
      end
    end
  end
end