Skip to content

Commit 33b3a58

Browse files
[MBL-19559][Student] Fix New Quizzes LTI error handling for expired assignments
refs: MBL-19559 affects: Student release note: Fixed issue where students couldn't view New Quizzes submissions after the assignment's until date had passed
1 parent 2c578cc commit 33b3a58

File tree

4 files changed

+37
-9
lines changed

4 files changed

+37
-9
lines changed

apps/student/src/main/java/com/instructure/student/features/assignments/details/datasource/AssignmentDetailsNetworkDataSource.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ class AssignmentDetailsNetworkDataSource(
6363
return quizInterface.getQuiz(courseId, quizId, params).dataOrThrow
6464
}
6565

66-
override suspend fun getExternalToolLaunchUrl(courseId: Long, externalToolId: Long, assignmentId: Long, forceNetwork: Boolean): LTITool {
66+
override suspend fun getExternalToolLaunchUrl(courseId: Long, externalToolId: Long, assignmentId: Long, forceNetwork: Boolean): LTITool? {
6767
val params = RestParams(isForceReadFromNetwork = forceNetwork)
68-
return assignmentInterface.getExternalToolLaunchUrl(courseId, externalToolId, assignmentId, restParams = params).dataOrThrow
68+
return assignmentInterface.getExternalToolLaunchUrl(courseId, externalToolId, assignmentId, restParams = params).dataOrNull
6969
}
7070

7171
override suspend fun getLtiFromAuthenticationUrl(url: String, forceNetwork: Boolean): LTITool {

apps/student/src/test/java/com/instructure/student/features/offline/assignmentdetails/AssignmentDetailsNetworkDataSourceTest.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,13 @@ class AssignmentDetailsNetworkDataSourceTest {
134134
Assert.assertEquals(expected, assignmentResult)
135135
}
136136

137-
@Test(expected = IllegalStateException::class)
138-
fun `Get LTI by launch url failure throws exception`() = runTest {
137+
@Test
138+
fun `Get LTI by launch url failure returns null`() = runTest {
139139
coEvery { assignmentInterface.getExternalToolLaunchUrl(any(), any(), any(), any(), any()) } returns DataResult.Fail()
140140

141-
dataSource.getExternalToolLaunchUrl(1, 1, 1, true)
141+
val result = dataSource.getExternalToolLaunchUrl(1, 1, 1, true)
142+
143+
Assert.assertNull(result)
142144
}
143145

144146
@Test

libs/pandautils/src/main/java/com/instructure/pandautils/features/assignments/details/AssignmentDetailsViewModel.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -684,9 +684,11 @@ class AssignmentDetailsViewModel @Inject constructor(
684684
SubmissionType.STUDENT_ANNOTATION -> postAction(AssignmentDetailAction.NavigateToAnnotationSubmissionScreen(assignment))
685685
SubmissionType.MEDIA_RECORDING -> postAction(AssignmentDetailAction.ShowMediaDialog(assignment))
686686
SubmissionType.EXTERNAL_TOOL, SubmissionType.BASIC_LTI_LAUNCH -> {
687-
externalLTITool.let {
687+
if (externalLTITool != null) {
688688
Analytics.logEvent(AnalyticsEventConstants.ASSIGNMENT_LAUNCHLTI_SELECTED)
689-
postAction(AssignmentDetailAction.NavigateToLtiLaunchScreen(assignment.name.orEmpty(), it, assignment.ltiToolType().openInternally))
689+
postAction(AssignmentDetailAction.NavigateToLtiLaunchScreen(assignment.name.orEmpty(), externalLTITool, assignment.ltiToolType().openInternally))
690+
} else {
691+
postAction(AssignmentDetailAction.ShowToast(resources.getString(R.string.generalUnexpectedError)))
690692
}
691693
}
692694
else -> Unit

libs/pandautils/src/test/java/com/instructure/pandautils/features/assignments/details/AssignmentDetailsViewModelTest.kt

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import com.instructure.canvasapi2.models.Course
3636
import com.instructure.canvasapi2.models.CourseSettings
3737
import com.instructure.canvasapi2.models.DiscussionTopicHeader
3838
import com.instructure.canvasapi2.models.Enrollment
39+
import com.instructure.canvasapi2.models.ExternalToolAttributes
3940
import com.instructure.canvasapi2.models.LockInfo
4041
import com.instructure.canvasapi2.models.Quiz
4142
import com.instructure.canvasapi2.models.SubAssignmentSubmission
@@ -670,19 +671,42 @@ class AssignmentDetailsViewModelTest {
670671
}
671672

672673
@Test
673-
fun `Submit button click - external tool`() {
674+
fun `Submit button click - external tool with valid LTI tool`() {
674675
val course = Course(enrollments = mutableListOf(Enrollment(type = Enrollment.EnrollmentType.Student)))
675676
coEvery { assignmentDetailsRepository.getCourseWithGrade(any(), any()) } returns course
676677

677678
val assignment = Assignment(submissionTypesRaw = listOf("external_tool"))
678-
coEvery { assignmentDetailsRepository.getAssignment(any(), any(), any(), any()) } returns assignment
679+
coEvery { assignmentDetailsRepository.getAssignment(any(), any(), any(), any()) } returns assignment.copy(
680+
externalToolAttributes = ExternalToolAttributes(contentId = 1L)
681+
)
682+
coEvery { assignmentDetailsRepository.getExternalToolLaunchUrl(any(), any(), any(), any()) } returns mockk(relaxed = true)
679683

680684
val viewModel = getViewModel()
681685
viewModel.onSubmitButtonClicked()
682686

683687
assertTrue(viewModel.events.value?.peekContent() is AssignmentDetailAction.NavigateToLtiLaunchScreen)
684688
}
685689

690+
@Test
691+
fun `Submit button click - external tool with null LTI tool shows error`() {
692+
val errorMessage = "An unexpected error occurred."
693+
every { resources.getString(R.string.generalUnexpectedError) } returns errorMessage
694+
695+
val course = Course(enrollments = mutableListOf(Enrollment(type = Enrollment.EnrollmentType.Student)))
696+
coEvery { assignmentDetailsRepository.getCourseWithGrade(any(), any()) } returns course
697+
698+
val assignment = Assignment(submissionTypesRaw = listOf("external_tool"))
699+
coEvery { assignmentDetailsRepository.getAssignment(any(), any(), any(), any()) } returns assignment
700+
coEvery { assignmentDetailsRepository.getExternalToolLaunchUrl(any(), any(), any(), any()) } returns null
701+
702+
val viewModel = getViewModel()
703+
viewModel.onSubmitButtonClicked()
704+
705+
val action = viewModel.events.value?.peekContent()
706+
assertTrue(action is AssignmentDetailAction.ShowToast)
707+
assertEquals(errorMessage, (action as AssignmentDetailAction.ShowToast).message)
708+
}
709+
686710
@Test
687711
fun `Create viewData with points when quantitative data is not restricted`() {
688712
coEvery { assignmentDetailsRepository.getCourseWithGrade(any(), any()) } returns Course(

0 commit comments

Comments
 (0)