0

This is the topic resolver. I'm trying to update a field in learning_path table each time this query is executed for a student.

class Resolvers::Topic < GraphQL::Schema::Resolver
  type Types::TopicType, null: true
  description 'Returns the topic information'
  argument :title, String, required: true

  def resolve(title:)
    user = context[:current_user]
    ability = Ability.for(user)
    topic = Topic.find_by(title: title)

    if %w[student teacher admin].include?(user&.role) && ability.can?(:read, Topic)
      if user&.role == 'student'
        user.userable.learning_paths.find_by(subject_id: topic.subject_id).update(visited_at: DateTime.now)
      end

      if %w[student teacher].include?(user&.role) && !user&.userable&.subjects&.include?(topic.subject)
        raise GraphQL::ExecutionError, 'This topic is not avaiable for you.'
      end

      topic
    else
      raise GraphQL::ExecutionError, 'You can't access this information.'
    end
  end
end

It works but the rspec is failling with this error:

 1) LmsApiSchema topic when there's a current user returns an error if the student is not subscribe
     Failure/Error: user.userable.learning_paths.find_by(subject_id: topic.subject_id).update(visited_at: DateTime.now)
     
     NoMethodError:
       undefined method `update' for nil:NilClass

topic rspec test that fails in testing:

context 'when there\'s a current user' do
      let!(:student) { create(:student) }
      let!(:user) { create(:user, userable: student) }
      let!(:subject_a) { create(:subject) }
      let!(:topic) { create(:topic, subject_id: subject_a.id) }
      let!(:question) { create(:question, topic_id: topic.id) }

      before do
        create(:option, question_id: question.id)
        prepare_context({ current_user: user })
      end

      it 'returns an error if the student is not subscribe' do
        expect(graphql!['errors'][0]['message']).to eq('This topic is not avaiable for you.')
      end

1 Answers1

0

Just worked out. Added the & before setting the method for avoiding the nil error. Figured it out thanks to this

user.userable.learning_paths.find_by(subject_id: topic.subject_id)&.update(visited_at: DateTime.now)