Skip to content

Commit 21c7aeb

Browse files
committed
reorganize program collection cards so queries are more efficient and add a test
1 parent cfbfdff commit 21c7aeb

File tree

4 files changed

+62
-8
lines changed

4 files changed

+62
-8
lines changed

frontends/api/src/mitxonline/test-utils/urls.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const currentUser = {
1414
}
1515

1616
const enrollment = {
17+
enrollmentsList: () => `${API_BASE_URL}/api/v1/enrollments/`,
1718
courseEnrollment: (id?: number) =>
1819
`${API_BASE_URL}/api/v1/enrollments/${id ? `${id}/` : ""}`,
1920
}
@@ -26,6 +27,7 @@ const b2b = {
2627
const programs = {
2728
programsList: (opts?: ProgramsApiProgramsListV2Request) =>
2829
`${API_BASE_URL}/api/v2/programs/${queryify(opts)}`,
30+
programDetail: (id: number) => `${API_BASE_URL}/api/v2/programs/${id}/`,
2931
}
3032

3133
const programCollections = {

frontends/main/src/app-pages/DashboardPage/CoursewareDisplay/test-utils.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,14 @@ const setupProgramsAndCourses = () => {
135135
setMockResponse.get(urls.programCollections.programCollectionsList(), {
136136
results: [programCollection],
137137
})
138+
setMockResponse.get(
139+
urls.programs.programsList({ id: programA.id, org_id: orgX.id }),
140+
{ results: [programA] },
141+
)
142+
setMockResponse.get(
143+
urls.programs.programsList({ id: programB.id, org_id: orgX.id }),
144+
{ results: [programB] },
145+
)
138146
setMockResponse.get(
139147
urls.courses.coursesList({ id: programA.courses, org_id: orgX.id }),
140148
{

frontends/main/src/app-pages/DashboardPage/OrganizationContent.test.tsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,30 @@ describe("OrganizationContent", () => {
9292
}
9393
})
9494
})
95+
96+
test("Renders program collections", async () => {
97+
const { orgX, programA, programB, programCollection, coursesA, coursesB } =
98+
setupProgramsAndCourses()
99+
setMockResponse.get(urls.enrollment.enrollmentsList(), [])
100+
programCollection.programs = [programA.id, programB.id]
101+
setMockResponse.get(urls.programCollections.programCollectionsList(), {
102+
results: [programCollection],
103+
})
104+
105+
renderWithProviders(<OrganizationContent orgSlug={orgX.slug} />)
106+
107+
const collectionHeader = await screen.findByRole("heading", {
108+
name: programCollection.title,
109+
})
110+
expect(collectionHeader).toBeInTheDocument()
111+
const collectionItems = await screen.findAllByTestId(
112+
"org-program-collection-root",
113+
)
114+
expect(collectionItems.length).toBe(1)
115+
const collection = within(collectionItems[0])
116+
expect(collection.getByText(programCollection.title)).toBeInTheDocument()
117+
// Check that the first course from each program is displayed
118+
expect(collection.getAllByText(coursesA[0].title).length).toBeGreaterThan(0)
119+
expect(collection.getAllByText(coursesB[0].title).length).toBeGreaterThan(0)
120+
})
95121
})

frontends/main/src/app-pages/DashboardPage/OrganizationContent.tsx

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ const OrgProgramCollectionDisplay: React.FC<{
108108
</ProgramHeader>
109109
<PlainList itemSpacing={0}>
110110
{collection.programIds.map((programId) => (
111-
<ProgramCard
111+
<ProgramCollectionItem
112112
key={programId}
113113
programId={programId}
114114
enrollments={enrollments}
@@ -165,28 +165,46 @@ const OrgProgramDisplay: React.FC<{
165165
)
166166
}
167167

168-
const ProgramCard: React.FC<{
168+
const ProgramCollectionItem: React.FC<{
169169
programId: number
170170
enrollments?: CourseRunEnrollment[]
171171
orgId: number
172172
}> = ({ programId, enrollments, orgId }) => {
173173
const program = useQuery(
174174
programsQueries.programsList({ id: programId, org_id: orgId }),
175175
)
176+
if (program.isLoading || !program.data?.results.length) {
177+
return (
178+
<Skeleton width="100%" height="65px" style={{ marginBottom: "16px" }} />
179+
)
180+
}
181+
const transformedProgram = transform.mitxonlineProgram(
182+
program.data?.results[0],
183+
)
184+
return (
185+
<ProgramCard
186+
program={transformedProgram}
187+
enrollments={enrollments}
188+
orgId={orgId}
189+
/>
190+
)
191+
}
192+
193+
const ProgramCard: React.FC<{
194+
program: DashboardProgram
195+
enrollments?: CourseRunEnrollment[]
196+
orgId?: number
197+
}> = ({ program, enrollments, orgId }) => {
176198
const courses = useQuery(
177199
coursesQueries.coursesList({
178-
id: program.data?.results[0]?.courses,
200+
id: program.courseIds,
179201
org_id: orgId,
180202
}),
181203
)
182204
const skeleton = (
183205
<Skeleton width="100%" height="65px" style={{ marginBottom: "16px" }} />
184206
)
185-
if (program.isLoading || !program.data?.results.length) return skeleton
186207
if (courses.isLoading) return skeleton
187-
const transformedProgram = transform.mitxonlineProgram(
188-
program.data?.results[0] ?? {},
189-
)
190208
const transformedCourses = transform.mitxonlineCourses({
191209
courses: courses.data?.results ?? [],
192210
enrollments: enrollments ?? [],
@@ -197,7 +215,7 @@ const ProgramCard: React.FC<{
197215
return (
198216
<DashboardCard
199217
Component="li"
200-
key={transformedProgram.key}
218+
key={program.key}
201219
dashboardResource={course}
202220
courseNoun={"Course"}
203221
offerUpgrade={false}

0 commit comments

Comments
 (0)