Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions compose-local-deps.yml
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,21 @@ services:
ports:
- "5432:5432"

it-postgres:
network_mode: bridge
container_name: it-postgres
image: postgres:16
volumes:
- ./src/main/resources/db_scripts/postgres-rutherford-create-script.sql:/docker-entrypoint-initdb.d/00-isaac-create.sql:ro
- ./src/main/resources/db_scripts/postgres-rutherford-functions.sql:/docker-entrypoint-initdb.d/01-isaac-functions.sql:ro
- ./src/main/resources/db_scripts/quartz_scheduler_create_script.sql:/docker-entrypoint-initdb.d/02-isaac-quartz.sql:ro
- ./src/test/resources/test-postgres-rutherford-data-dump.sql:/docker-entrypoint-initdb.d/03-isaac-test-data.sql:ro
environment:
POSTGRES_USER: rutherford
POSTGRES_PASSWORD: rutherf0rd
ports:
- "5433:5432"

# app-physics:
# network_mode: bridge
# container_name: app-physics
Expand Down
9 changes: 8 additions & 1 deletion src/main/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacade.java
Original file line number Diff line number Diff line change
Expand Up @@ -197,9 +197,16 @@ public final Response getAvailableQuizzes(@Context final Request request,
try {

String userRoleString = Role.STUDENT.name(); // Allow anonymous users to list STUDENT quizzes.
boolean showNofilterQuizzes = false;

AbstractSegueUserDTO currentUser = userManager.getCurrentUser(httpServletRequest);
if (currentUser instanceof RegisteredUserDTO) {
userRoleString = ((RegisteredUserDTO) currentUser).getRole().name();
try {
showNofilterQuizzes = isUserStaff(userManager, (RegisteredUserDTO) currentUser);
} catch (final NoUserLoggedInException e) {
// Not possible inside this if block!
}
}

// Cache the list of quizzes based on current content version, user's role, and startIndex:
Expand All @@ -217,7 +224,7 @@ public final Response getAvailableQuizzes(@Context final Request request,
// FIXME: ** HARD-CODED DANGER AHEAD **
// The limit parameter in the following call is hard-coded and should be returned to a more reasonable
// number once we have a front-end pagination/load-more system in place.
ResultsWrapper<ContentSummaryDTO> summary = this.quizManager.getAvailableQuizzes(userRoleString, startIndex, 9000);
ResultsWrapper<ContentSummaryDTO> summary = this.quizManager.getAvailableQuizzes(userRoleString, startIndex, 9000, showNofilterQuizzes);

return ok(summary).tag(etag)
.cacheControl(getCacheControl(NEVER_CACHE_WITHOUT_ETAG_CHECK, false))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,17 @@ public QuizManager(final AbstractConfigLoader properties, final ContentService c
this.contentSummarizerService = contentSummarizerService;
}

public ResultsWrapper<ContentSummaryDTO> getAvailableQuizzes(String visibleToRole, @Nullable Integer startIndex, @Nullable Integer limit) throws ContentManagerException {
public ResultsWrapper<ContentSummaryDTO> getAvailableQuizzes(String visibleToRole, @Nullable Integer startIndex, @Nullable Integer limit, boolean showNoFilterQuizzes) throws ContentManagerException {

List<GitContentManager.BooleanSearchClause> fieldsToMatch = Lists.newArrayList();
fieldsToMatch.add(new GitContentManager.BooleanSearchClause(
TYPE_FIELDNAME, Constants.BooleanOperator.AND, Collections.singletonList(QUIZ_TYPE)));

if (!showNoFilterQuizzes) {
fieldsToMatch.add(new GitContentManager.BooleanSearchClause(TAGS_FIELDNAME, BooleanOperator.NOT,
Collections.singletonList(HIDE_FROM_FILTER_TAG)));
}

if (null != visibleToRole) {
fieldsToMatch.add(new GitContentManager.BooleanSearchClause(HIDDEN_FROM_ROLES_FIELDNAME,
BooleanOperator.NOT, Collections.singletonList(visibleToRole)));
Expand Down
4 changes: 2 additions & 2 deletions src/test/java/uk/ac/cam/cl/dtg/isaac/IsaacTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -258,8 +258,8 @@ protected void initializeMocks() throws ContentManagerException, SegueDatabaseEx
quizManager = createMock(QuizManager.class);

registerDefaultsFor(quizManager, m -> {
expect(m.getAvailableQuizzes("STUDENT", 0, 9000)).andStubReturn(wrap(studentQuizSummary));
expect(m.getAvailableQuizzes("TEACHER", 0, 9000)).andStubReturn(wrap(studentQuizSummary, teacherQuizSummary));
expect(m.getAvailableQuizzes("STUDENT", 0, 9000, false)).andStubReturn(wrap(studentQuizSummary));
expect(m.getAvailableQuizzes("TEACHER", 0, 9000, false)).andStubReturn(wrap(studentQuizSummary, teacherQuizSummary));
expect(m.findQuiz(studentQuiz.getId())).andStubReturn(studentQuiz);
expect(m.findQuiz(studentQuizPreQuizAnswerChange.getId())).andStubReturn(studentQuizPreQuizAnswerChange);
expect(m.findQuiz(studentQuizPostQuizAnswerChange.getId())).andStubReturn(studentQuizPostQuizAnswerChange);
Expand Down
1 change: 1 addition & 0 deletions src/test/java/uk/ac/cam/cl/dtg/isaac/api/ITConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -129,4 +129,5 @@ public final class ITConstants {
public static final String QUIZ_TEST_QUIZ_ID = "_quiz_test";
public static final String QUIZ_HIDDEN_FROM_ROLE_STUDENTS_QUIZ_ID = "_hidden_from_roles_student_quiz_test";
public static final String QUIZ_HIDDEN_FROM_ROLE_TUTORS_QUIZ_ID = "_hidden_from_roles_tutor_quiz_test";
public static final String QUIZ_TEST_NOFILTER_QUIZ_ID = "_quiz_test_nofilter";
}
86 changes: 86 additions & 0 deletions src/test/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacadeIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,11 @@
import org.apache.commons.lang3.time.DateUtils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import org.junit.jupiter.params.provider.ValueSource;
import uk.ac.cam.cl.dtg.isaac.dos.QuizFeedbackMode;
import uk.ac.cam.cl.dtg.isaac.dos.users.RegisteredUser;
import uk.ac.cam.cl.dtg.isaac.dto.AssignmentStatusDTO;
import uk.ac.cam.cl.dtg.isaac.dto.IsaacQuizDTO;
import uk.ac.cam.cl.dtg.isaac.dto.QuizAssignmentDTO;
Expand All @@ -32,6 +36,8 @@
import jakarta.servlet.http.HttpServletRequest;
import jakarta.ws.rs.core.Request;
import jakarta.ws.rs.core.Response;
import uk.ac.cam.cl.dtg.isaac.dto.users.RegisteredUserDTO;

import java.util.Date;
import java.util.LinkedList;
import java.util.List;
Expand Down Expand Up @@ -164,6 +170,58 @@ public void getAvailableQuizzesEndpoint_getQuizzesAsTutor_returnsNoHiddenFromRol
assertFalse(responseBody.getResults().stream().anyMatch(q -> q.getId().equals(QUIZ_HIDDEN_FROM_ROLE_TUTORS_QUIZ_ID)));
}

@ParameterizedTest
@ValueSource(strings = {
ITConstants.TEST_TUTOR_EMAIL,
ITConstants.TEST_TEACHER_EMAIL,
})
public void getAvailableQuizzesEndpoint_getQuizzesAsNonStaff_omitsNofilterTaggedQuizzes(String email) throws Exception {
// Arrange
// log in, create request
LoginResult login = loginAs(httpSession, email, "test1234");
HttpServletRequest availableQuizzesRequest = createRequestWithCookies(new Cookie[]{login.cookie});
replay(availableQuizzesRequest);

// Act
// make request
Response getQuizzesResponse = quizFacade.getAvailableQuizzes(createNiceMock(Request.class), availableQuizzesRequest);

// Assert
// check status code is OK
assertEquals(Response.Status.OK.getStatusCode(), getQuizzesResponse.getStatus());

// check nofilter quizzes are not returned as available
@SuppressWarnings("unchecked") ResultsWrapper<QuizSummaryDTO> responseBody =
(ResultsWrapper<QuizSummaryDTO>) getQuizzesResponse.getEntity();
assertFalse(responseBody.getResults().stream().anyMatch(q -> q.getId().equals(QUIZ_TEST_NOFILTER_QUIZ_ID)));
}

@ParameterizedTest
@ValueSource(strings = {
ITConstants.TEST_EVENTMANAGER_EMAIL,
ITConstants.TEST_EDITOR_EMAIL
})
public void getAvailableQuizzesEndpoint_getQuizzesAsStaff_includesNofilterTaggedQuizzes(String email) throws Exception {
// Arrange
// log in, create request
LoginResult login = loginAs(httpSession, email, "test1234");
HttpServletRequest availableQuizzesRequest = createRequestWithCookies(new Cookie[]{login.cookie});
replay(availableQuizzesRequest);

// Act
// make request
Response getQuizzesResponse = quizFacade.getAvailableQuizzes(createNiceMock(Request.class), availableQuizzesRequest);

// Assert
// check status code is OK
assertEquals(Response.Status.OK.getStatusCode(), getQuizzesResponse.getStatus());

// check nofilter quizzes are returned as available
@SuppressWarnings("unchecked") ResultsWrapper<QuizSummaryDTO> responseBody =
(ResultsWrapper<QuizSummaryDTO>) getQuizzesResponse.getEntity();
assertTrue(responseBody.getResults().stream().anyMatch(q -> q.getId().equals(QUIZ_TEST_NOFILTER_QUIZ_ID)));
}

@Test
public void previewQuizEndpoint_previewInvisibleToStudentQuizAsTeacher_succeeds() throws Exception {
// Arrange
Expand Down Expand Up @@ -208,6 +266,34 @@ public void previewQuizEndpoint_previewHiddenFromRoleTutorQuizAsTutor_fails() th
assertEquals("You do not have the permissions to complete this action", responseBody.getErrorMessage());
}

@ParameterizedTest
@ValueSource(strings = {
ITConstants.TEST_TUTOR_EMAIL,
ITConstants.TEST_TEACHER_EMAIL,
ITConstants.TEST_EVENTMANAGER_EMAIL,
ITConstants.TEST_EDITOR_EMAIL
})
public void previewQuizEndpoint_previewNofilterQuizAsTutorOrAbove_succeeds(String email) throws Exception {
// Arrange
// log in as user, create request
LoginResult login = loginAs(httpSession, email, "test1234");
HttpServletRequest previewQuizRequest = createRequestWithCookies(new Cookie[]{login.cookie});
replay(previewQuizRequest);

// Act
// make request
Response previewQuizResponse = quizFacade.previewQuiz(createNiceMock(Request.class), previewQuizRequest,
QUIZ_TEST_NOFILTER_QUIZ_ID);

// Assert
// check status code is OK
assertEquals(Response.Status.OK.getStatusCode(), previewQuizResponse.getStatus());

// check the quiz is returned for preview
IsaacQuizDTO responseBody = (IsaacQuizDTO) previewQuizResponse.getEntity();
assertEquals(QUIZ_TEST_NOFILTER_QUIZ_ID, responseBody.getId());
}

@Test
public void viewQuizRubricEndpoint_viewRubricAvailableToRoleStudent_succeeds() throws Exception {
// Arrange
Expand Down
4 changes: 2 additions & 2 deletions src/test/resources/isaac-test-es-data.tar.gz
Git LFS file not shown
Loading