shared_examples_for "an exploitable" do
  Exploitable::FIELDS.each do |field|
    it { is_expected.to belong_to(field).optional }
    it { is_expected.to respond_to("#{field}_text") }

    describe "#{field}_value" do
      context "when a pre-defined value is chosen" do
        it "returns the label for that value" do
          exploitable = build(described_class.model_name.singular, 
                              field => build(field, label: "My Field"),
                              "#{field}_text" => "Test") 
          expect(exploitable.public_send("#{field}_value")).to eq "My Field"
        end
      end

      context "when 'Other' is chosen" do
        it "returns the #{field} text" do
          exploitable = build(described_class.model_name.singular, 
                              field => build(field, label: "Other"),
                              "#{field}_text" => "Test") 
          expect(exploitable.public_send("#{field}_value")).to eq "Test"
        end
      end

      if described_class.respond_to?(:contract_template)
        context "when a contract template is present" do
          it "returns the #{field} value from the contract template" do
            contract_template =  build(:contract_template, field => build(field, label: "Contract Template Field"))
            exploitable = build(described_class.model_name.singular, contract_template: contract_template)

            expect(exploitable.public_send("#{field}_value")).to eq "Contract Template Field"
          end
        end
      end
    end
  end
end
