spec/controllers/profiles_controller_spec.rb
# frozen_string_literal: true

#   Copyright (c) 2010-2011, Diaspora Inc.  This file is
#   licensed under the Affero General Public License version 3 or later.  See
#   the COPYRIGHT file.

describe ProfilesController, :type => :controller do
  before do
    sign_in eve, scope: :user
  end

  describe '#show' do
    let(:mock_person) { FactoryBot.create(:user) }
    let(:mock_presenter) { double(:as_json => {:rock_star => "Jamie Cai"})}

    it "returns a post Presenter" do
      expect(Person).to receive(:find_by_guid!).with("12345").and_return(mock_person)
      expect(PersonPresenter).to receive(:new).with(mock_person, eve).and_return(mock_presenter)

      get :show, params: {id: 12_345}, format: :json
      expect(response.body).to eq({:rock_star => "Jamie Cai"}.to_json)
    end
  end

  describe '#edit' do
    it 'succeeds' do
      get :edit
      expect(response).to be_successful
    end

    it 'sets the profile to the current users profile' do
      get :edit
      expect(assigns[:profile]).to eq(eve.person.profile)
    end

    it 'sets the aspect to "person_edit" ' do
      get :edit
      expect(assigns[:aspect]).to eq(:person_edit)
    end

    it 'sets the person to the current users person' do
      get :edit
      expect(assigns[:person]).to eq(eve.person)
    end
  end

  describe '#update' do
    it "sets the flash" do
      put :update, params: {
        profile: {
          image_url:  "",
          first_name: "Will",
          last_name:  "Smith"
        }
      }
      expect(flash[:notice]).not_to be_blank
    end

    it "sets nsfw" do
      expect(eve.person.reload.profile.nsfw).to eq(false)
      put :update, params: {profile: {id: eve.person.id, nsfw: "1"}}
      expect(eve.person.reload.profile.nsfw).to eq(true)
    end

    it "unsets nsfw" do
      eve.person.profile.nsfw = true
      eve.person.profile.save

      expect(eve.person.reload.profile.nsfw).to eq(true)
      put :update, params: {profile: {id: eve.person.id}}
      expect(eve.person.reload.profile.nsfw).to eq(false)
    end

    it 'sets tags' do
      params = { :id => eve.person.id,
                 :tags => '#apples #oranges',
                 :profile => {:tag_string => ''} }

      put :update, params: params
      expect(eve.person.reload.profile.tag_list.to_set).to eq(%w[apples oranges].to_set)
    end

    it 'sets plaintext tags' do
      params = { :id => eve.person.id,
                 :tags => ',#apples,#oranges,',
                 :profile => {:tag_string => '#pears'} }

      put :update, params: params
      expect(eve.person.reload.profile.tag_list.to_set).to eq(%w[apples oranges pears].to_set)
    end

    it 'sets plaintext tags without #' do
      params = { :id => eve.person.id,
                 :tags => ',#apples,#oranges,',
                 :profile => {:tag_string => 'bananas'} }

      put :update, params: params
      expect(eve.person.reload.profile.tag_list.to_set).to eq(%w[apples oranges bananas].to_set)
    end

    it 'sets valid birthday' do
      params = { :id => eve.person.id,
                 :profile => {
                   :date => {
                     :year => '2001',
                     :month => '02',
                     :day => '28' } } }

      put :update, params: params
      birthday = eve.person.reload.profile.birthday
      expect(birthday.year).to eq(2001)
      expect(birthday.month).to eq(2)
      expect(birthday.day).to eq(28)
    end

    it 'displays error for invalid birthday' do
      params = { :id => eve.person.id,
                 :profile => {
                   :date => {
                     :year => '2001',
                     :month => '02',
                     :day => '31' } } }

      put :update, params: params
      expect(flash[:error]).not_to be_blank
    end

    context 'with a profile photo set' do
      before do
        @params = { :id => eve.person.id,
                    :profile =>
                     {:image_url => "",
                      :last_name  => eve.person.profile.last_name,
                      :first_name => eve.person.profile.first_name }}

        eve.person.profile.image_url = "http://tom.joindiaspora.com/images/user/tom.jpg"
        eve.person.profile.save
      end

      it "doesn't overwrite the profile photo when an empty string is passed in" do
        image_url = eve.person.profile.image_url
        put :update, params: @params

        expect(Person.find(eve.person.id).profile.image_url).to eq(image_url)
      end
    end

    context 'mass assignment' do
      before do
        new_person = FactoryBot.create(:person)
        @profile_params = {:profile =>{ :person_id => new_person.id,
                                    :diaspora_handle => 'abc@a.com'}}
      end

      it 'person_id' do
        person = eve.person
        profile = person.profile
        put :update, params: @profile_params
        expect(profile.reload.person_id).to eq(person.id)
      end

      it 'diaspora handle' do
        put :update, params: @profile_params
        expect(Person.find(eve.person.id).profile[:diaspora_handle]).not_to eq('abc@a.com')
      end
    end
  end
end
