task_test.rb 9.2 KB
require_relative 'test_helper'

class TasksTest < ActiveSupport::TestCase

  def setup
    create_and_activate_user
    login_api
    @community = fast_create(Community)
    @environment = Environment.default
  end

  attr_accessor :person, :community, :environment

  should 'list tasks of environment' do
    environment.add_admin(person)
    task = create(Task, :requestor => person, :target => environment)
    get "/api/v1/tasks?#{params.to_query}"
    json = JSON.parse(last_response.body)
    assert_includes json["tasks"].map { |a| a["id"] }, task.id
  end

  should 'not list tasks of environment for unlogged users' do
    logout_api
    environment.add_admin(person)
    task = create(Task, :requestor => person, :target => environment)
    get "/api/v1/tasks?#{params.to_query}"
    json = JSON.parse(last_response.body)
    assert_equal 401, last_response.status
  end

  should 'return environment task by id' do
    environment.add_admin(person)
    task = create(Task, :requestor => person, :target => environment)
    get "/api/v1/tasks/#{task.id}?#{params.to_query}"
    json = JSON.parse(last_response.body)
    assert_equal task.id, json["task"]["id"]
  end

  should 'not return environment task by id for unlogged users' do
    logout_api
    environment.add_admin(person)
    task = create(Task, :requestor => person, :target => environment)
    get "/api/v1/tasks/#{task.id}?#{params.to_query}"
    json = JSON.parse(last_response.body)
    assert_equal 401, last_response.status
  end

  should 'not return environmet task if user has no permission to view it' do
    person = fast_create(Person)
    task = create(Task, :requestor => person, :target => environment)

    get "/api/v1/tasks/#{task.id}?#{params.to_query}"
    assert_equal 403, last_response.status
  end

 #############################
 #     Community Tasks    #
 #############################

  should 'return task by community' do
    community = fast_create(Community)
    community.add_admin(person)

    task = create(Task, :requestor => person, :target => community)
    assert person.is_member_of?(community)

    get "/api/v1/communities/#{community.id}/tasks/#{task.id}?#{params.to_query}"
    json = JSON.parse(last_response.body)
    assert_equal task.id, json["task"]["id"]
  end

  should 'not return task by community for unlogged users' do
    logout_api
    community = fast_create(Community)
    community.add_admin(person)

    task = create(Task, :requestor => person, :target => community)
    assert person.is_member_of?(community)

    get "/api/v1/communities/#{community.id}/tasks/#{task.id}?#{params.to_query}"
    json = JSON.parse(last_response.body)
    assert_equal 401, last_response.status
  end

  should 'not return task by community if user has no permission to view it' do
    community = fast_create(Community)
    task = create(Task, :requestor => person, :target => community)
    assert !person.is_member_of?(community)

    get "/api/v1/communities/#{community.id}/tasks/#{task.id}?#{params.to_query}"
    assert_equal 403, last_response.status
  end

  should 'create task in a community' do
    community = fast_create(Community)
    give_permission(person, 'perform_task', community)
    post "/api/v1/communities/#{community.id}/tasks?#{params.to_query}"
    json = JSON.parse(last_response.body)
    assert_not_nil json["task"]["id"]
  end

  should 'not create task in a community for unlogged users' do
    logout_api
    community = fast_create(Community)
    give_permission(person, 'perform_task', community)
    post "/api/v1/communities/#{community.id}/tasks?#{params.to_query}"
    json = JSON.parse(last_response.body)
    assert_equal 401, last_response.status
  end

  should 'create task defining the requestor as current profile logged in' do
    community = fast_create(Community)
    community.add_member(person)

    post "/api/v1/communities/#{community.id}/tasks?#{params.to_query}"
    json = JSON.parse(last_response.body)

    assert_equal person, Task.last.requestor
  end

  should 'create task defining the target as the community' do
    community = fast_create(Community)
    community.add_member(person)

    post "/api/v1/communities/#{community.id}/tasks?#{params.to_query}"
    json = JSON.parse(last_response.body)

    assert_equal community, Task.last.target
  end

 #############################
 #        Person Tasks       #
 #############################

  should 'return task by person' do
    task = create(Task, :requestor => person, :target => person)
    get "/api/v1/people/#{person.id}/tasks/#{task.id}?#{params.to_query}"
    json = JSON.parse(last_response.body)
    assert_equal task.id, json["task"]["id"]
  end

  should 'not return task by person for unlogged users' do
    logout_api
    task = create(Task, :requestor => person, :target => person)
    get "/api/v1/people/#{person.id}/tasks/#{task.id}?#{params.to_query}"
    json = JSON.parse(last_response.body)
    assert_equal 401, last_response.status
  end

  should 'not return task by person if user has no permission to view it' do
    some_person = fast_create(Person)
    task = create(Task, :requestor => person, :target => some_person)

    get "/api/v1/people/#{some_person.id}/tasks/#{task.id}?#{params.to_query}"
    assert_equal 403, last_response.status
  end

  should 'create task for person' do
    post "/api/v1/people/#{person.id}/tasks?#{params.to_query}"
    json = JSON.parse(last_response.body)
    assert_not_nil json["task"]["id"]
  end

  should 'not create task in person for unlogged users' do
    logout_api
    post "/api/v1/people/#{person.id}/tasks?#{params.to_query}"
    json = JSON.parse(last_response.body)
    assert_equal 401, last_response.status
  end

  should 'create task for another person' do
    some_person = fast_create(Person)
    post "/api/v1/people/#{some_person.id}/tasks?#{params.to_query}"
    json = JSON.parse(last_response.body)

    assert_equal some_person, Task.last.target
  end

  should 'create task defining the target as a person' do
    post "/api/v1/people/#{person.id}/tasks?#{params.to_query}"
    json = JSON.parse(last_response.body)

    assert_equal person, Task.last.target
  end

  task_actions=%w[finish cancel]
  task_actions_state={"finish"=>"FINISHED","cancel"=>"CANCELLED"}
  task_actions.each do |action|
    should "person be able to #{action} his own task" do
      login_api
      person1 = fast_create(Person)
      task = create(Task, :requestor => person1, :target => person)
      put "/api/v1/tasks/#{task.id}/#{action}?#{params.to_query}"
      assert_equal person.reload.id, task.reload.closed_by_id
      assert_equal "Task::Status::#{task_actions_state[action]}".constantize, task.reload.status
    end

    should "person not be able to #{action} other person's task" do
      login_api
      user = fast_create(User)
      person1 = fast_create(Person, :user_id => user)
      task = create(Task, :requestor => person, :target => person1)
      put "/api/v1/tasks/#{task.id}/#{action}?#{params.to_query}"
      assert_nil task.reload.closed_by_id
      assert_equal Task::Status::ACTIVE, task.status
    end
  end

 #############################
 #      Enterprise Tasks     #
 #############################

  should 'return task by enterprise' do
    enterprise = fast_create(Enterprise)
    enterprise.add_admin(person)

    task = create(Task, :requestor => person, :target => enterprise)
    assert person.is_member_of?(enterprise)

    get "/api/v1/enterprises/#{enterprise.id}/tasks/#{task.id}?#{params.to_query}"
    json = JSON.parse(last_response.body)
    assert_equal task.id, json["task"]["id"]
  end

  should 'not return task by enterprise for unlogged users' do
    logout_api
    enterprise = fast_create(Enterprise)
    enterprise.add_admin(person)

    task = create(Task, :requestor => person, :target => enterprise)
    assert person.is_member_of?(enterprise)

    get "/api/v1/enterprises/#{enterprise.id}/tasks/#{task.id}?#{params.to_query}"
    json = JSON.parse(last_response.body)
    assert_equal 401, last_response.status
  end

  should 'not return task by enterprise if user has no permission to view it' do
    enterprise = fast_create(Enterprise)
    task = create(Task, :requestor => person, :target => enterprise)
    assert !person.is_member_of?(enterprise)

    get "/api/v1/enterprises/#{enterprise.id}/tasks/#{task.id}?#{params.to_query}"
    assert_equal 403, last_response.status
  end

  should 'create task in a enterprise' do
    enterprise = fast_create(Enterprise)
    give_permission(person, 'perform_task', enterprise)
    post "/api/v1/enterprises/#{enterprise.id}/tasks?#{params.to_query}"
    json = JSON.parse(last_response.body)
    assert_not_nil json["task"]["id"]
  end

  should 'not create task in a enterprise for unlogged users' do
    logout_api
    enterprise = fast_create(Enterprise)
    give_permission(person, 'perform_task', enterprise)
    post "/api/v1/enterprises/#{enterprise.id}/tasks?#{params.to_query}"
    json = JSON.parse(last_response.body)
    assert_equal 401, last_response.status
  end

  should 'create task defining the target as the enterprise' do
    enterprise = fast_create(Enterprise)
    enterprise.add_member(person)

    post "/api/v1/enterprises/#{enterprise.id}/tasks?#{params.to_query}"
    json = JSON.parse(last_response.body)

    assert_equal enterprise, Task.last.target
  end

end