canvas-lms/spec/apis/v1/favorites_api_spec.rb

234 lines
11 KiB
Ruby

# frozen_string_literal: true
#
# Copyright (C) 2012 Instructure, Inc.
#
# This file is part of Canvas.
#
# Canvas 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, version 3 of the License.
#
# Canvas 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 this program. If not, see <http://www.gnu.org/licenses/>.
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe "Favorites API", type: :request do
before :once do
user_factory(active_all: true)
@courses = create_courses(6, enroll_user: @user, enrollment_type: "StudentEnrollment", return_type: :record)
end
context "implicit favorites" do
it "lists favorite courses" do
json = api_call(:get, "/api/v1/users/self/favorites/courses", :controller => "favorites", :action => "list_favorite_courses", :format => "json")
expect(json.size).to eql(6)
expect(json[0]['id']).to eql @courses[0].id
expect(json[0]['name']).to eql @courses[0].name
expect(json[0]['course_code']).to eql @courses[0].course_code
expect(json[0]['enrollments'][0]['type']).to eql 'student'
expect(json.collect { |row| row["id"] }.sort).to eql(@user.menu_courses.collect { |c| c[:id] }.sort)
expect(@user.favorites.size).to be_zero
end
context "observed users" do
before :once do
@observer_enrollment = course_with_observer(active_all: true)
@observer = @user
@courses << @course
@observer_course = @course
@observed_student = create_users(1, return_type: :record).first
@student_enrollment =
@observer_course.enroll_student(@observed_student,
:enrollment_state => 'active')
@assigned_observer_enrollment =
@observer_course.enroll_user(@observer, "ObserverEnrollment",
:associated_user_id => @observed_student.id)
@assigned_observer_enrollment.accept
end
it "includes observed users" do
json = api_call_as_user(@observer, :get,
"/api/v1/users/self/favorites/courses?include[]=observed_users",
:controller => "favorites", :include => ["observed_users"],
:action => "list_favorite_courses", :format => "json")
expect(json[0]['enrollments']).to match_array [{
"type" => "observer",
"role" => @assigned_observer_enrollment.role.name,
"role_id" => @assigned_observer_enrollment.role.id,
"user_id" => @assigned_observer_enrollment.user_id,
"enrollment_state" => "active",
"limit_privileges_to_course_section" => false,
"associated_user_id" => @observed_student.id
}, {
"type" => "observer",
"role" => @observer_enrollment.role.name,
"role_id" => @observer_enrollment.role.id,
"user_id" => @observer_enrollment.user_id,
"enrollment_state" => "active",
"limit_privileges_to_course_section" => false,
}, {
"type" => "student",
"role" => @student_enrollment.role.name,
"role_id" => @student_enrollment.role.id,
"user_id" => @student_enrollment.user_id,
"enrollment_state" => "active",
"limit_privileges_to_course_section" => false,
}]
end
end
end
context "explicit favorites" do
before :once do
@courses[0...3].each do |course|
@user.favorites.build(:context => course)
end
@user.save
end
it "lists favorite courses" do
json = api_call(:get, "/api/v1/users/self/favorites/courses", :controller => "favorites", :action => "list_favorite_courses", :format => "json")
expect(json.size).to eql(3)
expect(json[0]['id']).to eql @courses[0].id
expect(json[0]['name']).to eql @courses[0].name
expect(json[0]['course_code']).to eql @courses[0].course_code
expect(json[0]['enrollments'][0]['type']).to eql 'student'
expect(json.collect { |row| row["id"] }.sort).to eql(@user.favorites.by('Course').collect { |c| c[:context_id] }.sort)
end
it "adds a course to favorites" do
@user.favorites.by("Course").destroy_all
# add some new courses, and fave one
course6 = course_with_student(:course_name => "Course 6", :user => @user, :active_all => true).course
course7 = course_with_student(:course_name => "Course 7", :user => @user, :active_all => true).course
json = api_call(:post, "/api/v1/users/self/favorites/courses/#{course6.id}",
{ :controller => "favorites", :action => "add_favorite_course", :format => "json", :id => "#{course6.id}" })
expect(json["context_id"]).to eql(course6.id)
# now favorites should include the implicit courses from before, plus the one we faved
@user.reload
expect(@user.favorites.size).to eql(1)
end
it "creates favorites from implicit favorites when removing a course" do
@user.favorites.by("Course").destroy_all
# remove a course from favorites
json = api_call(:delete, "/api/v1/users/self/favorites/courses/#{@courses[0].id}",
{ :controller => "favorites", :action => "remove_favorite_course", :format => "json", :id => "#{@courses[0].id}" })
expect(json["context_id"]).to eql(@courses[0].id)
# now favorites should include the implicit courses from before, minus the one we removed
@user.reload
expect(@user.favorites.size).to eql(5)
end
it "removes a course from favorites" do
expect(@user.favorites.size).to eql(3)
# remove a course from favorites
json = api_call(:delete, "/api/v1/users/self/favorites/courses/#{@courses[0].id}",
{ :controller => "favorites", :action => "remove_favorite_course", :format => "json", :id => "#{@courses[0].id}" })
expect(json["context_id"]).to eql(@courses[0].id)
# now favorites should include the implicit courses from before, minus the one we removed
@user.reload
expect(@user.favorites.size).to eql(2)
end
it "does not create a duplicate by fav'ing an already faved course" do
expect(@user.favorites.size).to eql(3)
json = api_call(:post, "/api/v1/users/self/favorites/courses/#{@courses[0].id}",
{ :controller => "favorites", :action => "add_favorite_course", :format => "json", :id => "#{@courses[0].id}" })
expect(json["context_id"]).to eql(@courses[0].id)
@user.reload
expect(@user.favorites.size).to eql(3)
end
it "returns an empty hash when removing a non-faved course" do
json = api_call(:delete, "/api/v1/users/self/favorites/courses/#{@courses[5].id}",
{ :controller => "favorites", :action => "remove_favorite_course", :format => "json", :id => "#{@courses[5].id}" })
expect(json.size).to be_zero
end
it "resets favorites" do
expect(@user.favorites.size).not_to be_zero
api_call(:delete, "/api/v1/users/self/favorites/courses",
{ :controller => "favorites", :action => "reset_course_favorites", :format => "json" })
@user.reload
expect(@user.favorites.size).to be_zero
end
end
context "group favorites" do
before :each do
@user = user_model
@context = course_model
@group_fave = Group.create!(:name => "group1", :context => @context)
@group_not_fave = Group.create!(:name => "group2", :context => @context)
@group_not_yet_fave = Group.create!(:name => "group3", :context => @context)
@group_fave.add_user(@user)
@group_not_fave.add_user(@user)
@group_not_yet_fave.add_user(@user)
@user.favorites.build(:context => @group_fave)
@user.save
end
it "add favorite group" do
api_call(:post, "/api/v1/users/self/favorites/groups/#{@group_not_yet_fave.id}",
:controller => "favorites", :action => "add_favorite_groups", :format => "json", :id => @group_not_yet_fave.id)
expect(@user.favorites.size).to eql(2) # Added one in before method, one in test
end
it "lists favorite groups" do
json = api_call(:get, "/api/v1/users/self/favorites/groups",
:controller => "favorites", :action => "list_favorite_groups", :format => "json")
expect(json[0]['id']).to eql @group_fave.id
expect(@user.favorites.size).to eql(1)
end
it "clears favorite groups" do
expect(@user.favorites.size).to eql(1)
group_fave_2 = Group.create!(:name => "new_fave", :context => @context)
group_fave_2.add_user(@user)
api_call(:post, "/api/v1/users/self/favorites/groups/#{group_fave_2.id}",
:controller => "favorites", :action => "add_favorite_groups", :format => "json", :id => group_fave_2.id)
expect(@user.favorites.size).to eql(2)
api_call(:delete, "/api/v1/users/self/favorites/groups",
:controller => "favorites", :action => "reset_groups_favorites", :format => "json")
expect(@user.favorites.size).to eql(0)
end
it "deletes one favorite group" do
json = api_call(:delete, "/api/v1/users/self/favorites/groups/#{@group_fave.id}",
:controller => "favorites", :action => "remove_favorite_groups", :format => "json", :id => @group_fave.id)
expect(json['context_type']).to eql("Group")
end
it "lists all groups if none are favorited" do
api_call(:delete, "/api/v1/users/self/favorites/groups",
:controller => "favorites", :action => "reset_groups_favorites", :format => "json")
expect(@user.favorites.size).to eql(0)
json = api_call(:get, "/api/v1/users/self/favorites/groups",
:controller => "favorites", :action => "list_favorite_groups", :format => "json")
expect(json.any?).to be
end
end
it "ignores master courses if requested" do
MasterCourses::MasterTemplate.set_as_master_course(@courses[0])
json = api_call(:get, "/api/v1/users/self/favorites/courses", :controller => "favorites", :action => "list_favorite_courses", :format => "json")
expect(json.size).to eql(6)
json = api_call(:get, "/api/v1/users/self/favorites/courses?exclude_blueprint_courses=1",
:controller => "favorites", :action => "list_favorite_courses", :format => "json", :exclude_blueprint_courses => "1")
expect(json.size).to eql(5)
end
end