require 'spec_helper'

describe Parsable::Parser do

  describe '#parse' do

    context "when no variables" do
      it "returns empty" do
        parsed = Parsable::Parser.new(:string => "novariables").parse
        expect(parsed).to be_empty
      end
    end

    context 'when one variable' do

      context 'no function method' do
        before :each do
          @parsed = Parsable::Parser.new(:string => %(my+{{location.name}}@email.com)).parse.first
        end
        it "parses object name" do
          expect(@parsed[:object]).to eql('location')
        end

        it "parses attribute" do
          expect(@parsed[:attribute]).to eql('name')
        end
      end

      context "function method" do
        it "parses function method" do
          string = %(my+{{url_safe(location.name)}}@email.com)
          parsed = Parsable::Parser.new(:string => string).parse.first
          expect(parsed[:function]).to eql('url_safe')
        end
      end
    end

    context 'when multiple variables' do
      before :each do
        @parsed = Parsable::Parser.new(:string => %(my+{{location.name}}@{{email.domain}}.com)).parse
      end

      it "returns multiple strings" do
        expect(@parsed.size).to eql(2)
      end

      context 'no function method' do
        it "parses object names" do
          expect(@parsed.first[:object]).to eql('location')
          expect(@parsed.last[:object]).to eql('email')
        end

        it "parses attributes" do
          expect(@parsed.first[:attribute]).to eql('name')
          expect(@parsed.last[:attribute]).to eql('domain')
        end
      end

      context "function method" do
        it "parses function methods" do
          string = %(my+{{url_safe(location.name)}}@{{email.domain}}.com)
          parsed = Parsable::Parser.new(:string => string).parse

          expect(parsed.first[:function]).to eql('url_safe')
          expect(parsed.last[:function]).to be_nil
        end
      end
    end
  end

end