@@ -277,3 +277,170 @@ def test_staff_can_update_other_user_course_archive_status(
277277
278278 assert response .status_code == status .HTTP_200_OK
279279 assert response .data ["is_archived" ] is True
280+
281+
282+ # New tests for optional user field behavior
283+ @pytest .mark .django_db
284+ def test_create_course_archive_status_without_user_field (api_client , user , course_key ):
285+ """
286+ Test that a user can create a course archive status without specifying user field.
287+ The user field should default to the current user.
288+ """
289+ api_client .force_authenticate (user = user )
290+ url = reverse ("sample_plugin:course-archive-status-list" )
291+ data = {
292+ "course_id" : str (course_key ),
293+ "is_archived" : True ,
294+ }
295+ # Note: No "user" field in data
296+ response = api_client .post (url , data , format = "json" )
297+
298+ if response .status_code != status .HTTP_201_CREATED :
299+ print (f"Response status: { response .status_code } " )
300+ print (f"Response data: { response .data } " )
301+
302+ assert response .status_code == status .HTTP_201_CREATED
303+ assert response .data ["course_id" ] == str (course_key )
304+ assert response .data ["user" ] == user .id
305+ assert response .data ["is_archived" ] is True
306+ assert response .data ["archive_date" ] is not None
307+
308+ # Verify in database
309+ course_archive_status = CourseArchiveStatus .objects .get (
310+ course_id = course_key , user = user
311+ )
312+ assert course_archive_status .is_archived is True
313+ assert course_archive_status .user == user
314+
315+
316+ @pytest .mark .django_db
317+ def test_update_course_archive_status_without_user_field (api_client , user , course_archive_status ):
318+ """
319+ Test that a user can update their course archive status without specifying user field.
320+ The user field should remain unchanged.
321+ """
322+ api_client .force_authenticate (user = user )
323+ url = reverse (
324+ "sample_plugin:course-archive-status-detail" , args = [course_archive_status .id ]
325+ )
326+ data = {"is_archived" : True }
327+ # Note: No "user" field in data
328+ response = api_client .patch (url , data , format = "json" )
329+
330+ assert response .status_code == status .HTTP_200_OK
331+ assert response .data ["is_archived" ] is True
332+ assert response .data ["user" ] == user .id
333+ assert response .data ["archive_date" ] is not None
334+
335+ # Verify in database
336+ course_archive_status .refresh_from_db ()
337+ assert course_archive_status .is_archived is True
338+ assert course_archive_status .user == user
339+
340+
341+ @pytest .mark .django_db
342+ def test_staff_create_with_explicit_user_override (
343+ api_client , staff_user , user , course_key
344+ ):
345+ """
346+ Test that staff can explicitly set user field to override default behavior.
347+ """
348+ api_client .force_authenticate (user = staff_user )
349+ url = reverse ("sample_plugin:course-archive-status-list" )
350+ data = {
351+ "course_id" : str (course_key ),
352+ "user" : user .id ,
353+ "is_archived" : True ,
354+ }
355+ response = api_client .post (url , data , format = "json" )
356+
357+ assert response .status_code == status .HTTP_201_CREATED
358+ assert response .data ["course_id" ] == str (course_key )
359+ assert response .data ["user" ] == user .id # Should be the specified user, not staff_user
360+ assert response .data ["is_archived" ] is True
361+
362+ # Verify in database
363+ course_archive_status = CourseArchiveStatus .objects .get (
364+ course_id = course_key , user = user
365+ )
366+ assert course_archive_status .user == user
367+ assert course_archive_status .user != staff_user
368+
369+
370+ @pytest .mark .django_db
371+ def test_staff_update_with_explicit_user_override (
372+ api_client , staff_user , user , another_user , course_key
373+ ):
374+ """
375+ Test that staff can explicitly change user field when updating.
376+ """
377+ # Create initial record for user
378+ initial_status = CourseArchiveStatus .objects .create (
379+ course_id = course_key , user = user , is_archived = False
380+ )
381+
382+ api_client .force_authenticate (user = staff_user )
383+ url = reverse (
384+ "sample_plugin:course-archive-status-detail" , args = [initial_status .id ]
385+ )
386+ data = {
387+ "user" : another_user .id ,
388+ "is_archived" : True ,
389+ }
390+ response = api_client .patch (url , data , format = "json" )
391+
392+ assert response .status_code == status .HTTP_200_OK
393+ assert response .data ["user" ] == another_user .id # Should be changed to another_user
394+ assert response .data ["is_archived" ] is True
395+
396+ # Verify in database
397+ initial_status .refresh_from_db ()
398+ assert initial_status .user == another_user
399+ assert initial_status .is_archived is True
400+
401+
402+ @pytest .mark .django_db
403+ def test_regular_user_cannot_override_user_field_create (
404+ api_client , user , another_user , course_key
405+ ):
406+ """
407+ Test that regular users cannot override user field to create records for other users.
408+ """
409+ api_client .force_authenticate (user = user )
410+ url = reverse ("sample_plugin:course-archive-status-list" )
411+ data = {
412+ "course_id" : str (course_key ),
413+ "user" : another_user .id , # Try to create for another user
414+ "is_archived" : True ,
415+ }
416+ response = api_client .post (url , data , format = "json" )
417+
418+ assert response .status_code == status .HTTP_403_FORBIDDEN
419+
420+
421+ @pytest .mark .django_db
422+ def test_staff_create_without_user_field_defaults_to_current_user (
423+ api_client , staff_user , course_key
424+ ):
425+ """
426+ Test that even staff users get records created for themselves when no user specified.
427+ """
428+ api_client .force_authenticate (user = staff_user )
429+ url = reverse ("sample_plugin:course-archive-status-list" )
430+ data = {
431+ "course_id" : str (course_key ),
432+ "is_archived" : True ,
433+ }
434+ # Note: No "user" field in data
435+ response = api_client .post (url , data , format = "json" )
436+
437+ assert response .status_code == status .HTTP_201_CREATED
438+ assert response .data ["course_id" ] == str (course_key )
439+ assert response .data ["user" ] == staff_user .id # Should default to current user (staff)
440+ assert response .data ["is_archived" ] is True
441+
442+ # Verify in database
443+ course_archive_status = CourseArchiveStatus .objects .get (
444+ course_id = course_key , user = staff_user
445+ )
446+ assert course_archive_status .user == staff_user
0 commit comments