Skip to content
Snippets Groups Projects
Forked from PortalMEC / portalmec
475 commits behind the upstream repository.
users_spec.rb 9.99 KiB

# Copyright (C) 2015 Centro de Computacao Cientifica e Software Livre
# Departamento de Informatica - Universidade Federal do Parana
#
# This file is part of portalmec.
#
# portalmec is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# portalmec is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with portalmec.  If not, see <http://www.gnu.org/licenses/>.

require 'acceptance_helpers'
require 'shared/contexts'

resource 'Users' do
  header 'Accept', 'application/json'
  header 'Content-Type', 'application/json'

  explanation "User represents the teacher and students in the system."

  before { 12.times { create(:user) } }

  let(:users) { User.all }
  let(:subject) { Subject.all }
  let(:role) { Role.all }

  get '/v1/users' do
    parameter :limit, 'Limit of users'
    parameter :offset, 'Offset of users'

    let(:limit) { 12 }
    let(:offset) { 0 }

    example_request 'Get a list of users' do
      # active model serializer may render model associations in different order for collections (array of items), so we're verifing only returned ids
      expect(JSON.parse(response_body).map { |o| o['id'] }.sort).to eq(User.limit(limit).offset(offset).pluck(:id).sort)
      expect(status).to eq(200)
    end
  end

  get '/v1/users/:id' do
    let(:id) { users.first.id }

    example 'Get an user' do
      do_request
      expect(path).to eq("/v1/users/#{id}") # `:id` is replaced with the value of `id`
      expect(response_body).to eq(Helper.serialize(User.find(id)))
      expect(status).to eq(200)
    end
  end

  get '/v1/users/:id/versions' do
    include_context "authenticate_user"

    before do
      @user = create(:user)
      @user.update(name: Faker::Name.name, email: Faker::Internet.email)
    end

    let(:id) { @user.id }

    example 'Getting all user versions' do
      do_request
      expect(path).to eq("/v1/users/#{id}/versions") # `:id` is replaced with the value of `id`
      expect(response_body).to eq(Helper.serialize(@user.versions))
      expect(status).to eq(200)
    end
  end

  post '/v1/auth' do

    parameter :name, 'The name of the user'
    parameter :email, 'The email of user'
    parameter :description, 'The user description'
    parameter :password, 'The password of user'
    parameter :password_confirmation, 'The password confirmation of user'
    parameter :terms_of_service, 'Checks if user agreed with terms of service'
    parameter :avatar, 'The user avatar'

    let(:name) { Faker::Name.name }
    let(:email) { Faker::Internet.email }
    let(:description) { Faker::Lorem.sentence }
    let(:password) { '12345678' }
    let(:password_confirmation) { '12345678' }
    let(:terms_of_service) { true }
    let(:avatar) {""}
    let(:raw_post) {params.to_json}

    example 'Creating an user' do
      do_request
      expect(status).to eq(200)
    end
  end

  put '/v1/users/:id' do
    include_context "authenticate_user"

    parameter :id, 'The user id'
    parameter :name, 'The name of the user'
    parameter :email, 'The email of user'
    parameter :description, 'The user description'
    parameter :education, 'The user education'
    parameter :password, 'The password of user'
    parameter :password_confirmation, 'The password confirmation of user'
    parameter :terms_of_service, 'Checks if user agreed with terms of service'
    parameter :avatar, 'The user avatar'
    parameter :roles_ids, 'The user roles', scope: :user
    parameter :subjects, 'Array with subjects ids', scope: :user

    let(:id) {@user.id}
    let(:name) { Faker::Name.name }
    let(:email) { Faker::Internet.email }
    let(:description) { Faker::Lorem.sentence }
    let(:education) { Faker::Lorem.sentence }
    let(:password) { '12345678' }
    let(:password_confirmation) { '12345678' }
    let(:terms_of_service) { true }
    let(:avatar) {""}
	# TODO role ids con't be changed if user isn't admin, send []
	# when it's a admin send [role.first.id]
    let(:roles_ids) { [] }
    let(:subjects) { [subject.first.id] }
    let(:raw_post) {params.to_json}

    example 'Updating an user' do
      do_request
      expect(status).to eq(200)
    end
  end

  post '/v1/auth/sign_in' do
    include_context "authenticate_user"

    parameter :email, 'The email of user'
    parameter :password, 'The password of user'

    let(:email) { @user.email }
    let(:password) { @user.password }

    let(:raw_post) {params.to_json}

    example 'Signing in' do
      do_request
      expect(status).to eq(200)
    end
  end

  get '/v1/users/:id/following/:type' do
    include_context "authenticate_user"

    before do
      @collection = create(:collection, privacy: "public")
      @follow = create(:follow, user: @user, followable: @collection)
    end

    let(:id) { @user.id }
    let(:type) { "Collection" }

    example 'Showing what the user is following' do
      do_request
      expect(status).to eq(200)
    end
  end

  get '/v1/users/:id/followers' do
    include_context "authenticate_user"

    before do
      @user1 = create(:user)
      @follow = create(:follow, user: @user1, followable: @user)
    end

    let(:id) { @user.id }

    example 'Showing an user followers' do
      do_request
      expect(status).to eq(200)
    end
  end

  get '/v1/users/:id/reviews/received' do
    include_context "authenticate_user"

    before do
      @learning_object = create(:learning_object, publisher: @user)
      create(:review, reviewable: @learning_object)
    end

    let(:id) { @user.id }

    example 'Showing an user’s received reviews' do
      do_request
      expect(status).to eq(200)
    end
  end

  get '/v1/users/:id/reviews/own' do
    include_context "authenticate_user"

    before do
      create(:review, user: @user)
    end

    let(:id) { @user.id }

    example 'Showing a user’s own reviews' do
      do_request
      expect(status).to eq(200)
    end
  end

  get '/v1/users/:id/collections/liked' do
    include_context "authenticate_user"

    before do
      create(:like, user: @user, likeable: create(:collection))
    end

    let(:id) { @user.id }

    example 'Showing an user’s liked collections' do
      do_request
      expect(status).to eq(200)
    end
  end

  get '/v1/users/:id/learning_objects/liked' do
    include_context "authenticate_user"

    before do
      create(:like, user: @user)
    end

    let(:id) { @user.id }

    example 'Showing an user’s liked learning objects' do
      do_request
      expect(status).to eq(200)
    end
  end

  get '/v1/users/:id/learning_objects' do
    include_context "authenticate_user"

    before do
      create(:learning_object, publisher: @user)
    end

    let(:id) { @user.id }

    example 'Showing an user’s learning objects' do
      do_request
      expect(status).to eq(200)
    end
  end

  get '/v1/users/:id/collections' do
    include_context "authenticate_user"

    before do
      create(:collection, owner: @user)
    end

    let(:id) { @user.id }

    example 'Showing an user’s collections' do
      do_request
      expect(status).to eq(200)
    end
  end

  get '/v1/users/:id/drafts' do
    include_context "authenticate_user"

    before do
      create(:learning_object, publisher: @user, state: LearningObject.states[:draft])
    end

    let(:id) { @user.id }

    example 'Showing an user’s drafts' do
      do_request
      expect(status).to eq(200)
    end
  end

  delete '/v1/auth' do
    include_context "authenticate_user"

    example 'Destroying an user' do
      do_request
      expect(status).to eq(200)
    end
  end

  post '/v1/users' do
    include_context "authenticate_user_admin"

    parameter :name, 'The name of the user', scope: :user
    parameter :email, 'The email of user', scope: :user
    parameter :description, 'The user description', scope: :user
    parameter :password, 'The password of user', scope: :user
    parameter :password_confirmation, 'The password confirmation of user', scope: :user
    parameter :terms_of_service, 'Checks if user agreed with terms of service', scope: :user
    parameter :avatar, 'The user avatar', scope: :user

    let(:name) { Faker::Name.name }
    let(:email) { Faker::Internet.email }
    let(:description) { Faker::Lorem.sentence }
    let(:password) { '12345678' }
    let(:password_confirmation) { '12345678' }
    let(:terms_of_service) { true }
    let(:avatar) {""}
    let(:raw_post) {params.to_json}

    example 'Creating an user by admin' do
      do_request
      expect(status).to eq(201)
    end
  end

  delete '/v1/users/:id' do
    include_context "authenticate_user_admin"

    parameter :id, 'The id of the user to be destroyed'
    let(:id) {@user.id}

    before do
      @user = create(:user)
    end

    example 'Destroying an user by admin' do
      do_request
      expect(status).to eq(200)
    end
  end

  get '/v1/users/upload_requests' do
    include_context "authenticate_user_supervisor"

    example 'Get all user that want be submitters' do
      do_request
      expect(status).to eq(200)
    end
  end

  post '/v1/users/submitter_request' do
    include_context "authenticate_user"

    example 'Request to be a submitter' do
      do_request
      expect(status).to eq(200)
    end
  end

  post '/v1/users/:id/approve_request' do
    include_context "authenticate_user_supervisor"

    parameter :id, 'The id of the user who asked to be a submitter'
    parameter :approves, 'If the user can be a submitter or not'

    let(:id) {@user.id}
    let(:approves) { true }
    let(:raw_post) {params.to_json}

    before do
      @user = create(:user, )
          @user.update(submitter_request: User.submitter_requests[:requested])
    end

    example 'Approve a submitter request' do
      do_request
      expect(status).to eq(200)
    end
  end
end