def test_text_comment_list_view_with_various_lengths( client, django_user_model, mocker, text_comment_count, ): """ Simple test that lists all text comments for a given track. """ TextComment = apps.get_model("comments", "TextComment") # Initialize user credentials = { "username": "******", "password": "******", } user = django_user_model.objects.create_user(**credentials) # Login response = client.login(**credentials) # Initialize stream url = reverse("streams:stream-initialize") response = client.post(url) # Create a track object track = create_test_track() # Create comment text_comments = [] for idx in range(text_comment_count): text_comment = TextComment.objects.create( user=user, format=TextComment.FORMAT_TEXT, text="Hello, world!", track_id=track.uuid, timestamp_ms=4200 + idx, ) assert not text_comment.deleted_at text_comments.append(text_comment) # List comments response_json = response.json() url = reverse("comments:text-comment-list") data = {"trackUuid": track.uuid} response = client.get(url, data) # Verify response response_json = response.json() assert response_json["system"]["status"] == 200 assert response_json["redux"]["type"] == "textComment/listSet" response_text_comments = response_json["redux"]["payload"]["textComments"] # This also asserts that the comments are in the expected order assert len(response_text_comments) == text_comment_count for idx in range(text_comment_count): assert response_text_comments[idx]["uuid"] == str( text_comments[idx].uuid)
def test_text_comment_modification_create_modification(django_user_model, ptrs, modification_count, archived_count): """ Test the custom create method. When creating, existing overlapping objects should be condensed. """ TextComment = apps.get_model("comments", "TextComment") TextCommentModification = apps.get_model("comments", "TextCommentModification") # Initialize user credentials = { "username": "******", "password": "******", } user = django_user_model.objects.create_user(**credentials) # Create a track object track = create_test_track() text_comment = TextComment.objects.create( user=user, format=TextComment.FORMAT_TEXT, text="0123456789", track_id=track.uuid, timestamp_ms=4200, ) style = TextCommentModification.STYLE_BOLD with pgtrigger.ignore("comments.TextCommentModification:protect_inserts"): for (start_ptr, end_ptr) in ptrs: TextCommentModification.objects.create( user=user, text_comment_id=text_comment.uuid, start_ptr=start_ptr, end_ptr=end_ptr, style=style, ) TextCommentModification.objects.create_modification( user=user, text_comment_id=text_comment.uuid, start_ptr=3, end_ptr=7, style=style, ) actual_modification_count = TextCommentModification.objects.filter( deleted_at__isnull=True).count() assert actual_modification_count == modification_count actual_archived_count = TextCommentModification.objects.filter( deleted_at__isnull=False).count() assert actual_archived_count == archived_count
def test_marker_create_view_happy_path( client, django_user_model, mocker, ): """ Simple case for creating a text comment through the API. """ Marker = apps.get_model("streams", "Marker") # Initialize user credentials = {"username": "******", "password": "******"} user = django_user_model.objects.create_user(**credentials) # Login response = client.login(**credentials) # Initialize stream url = reverse("streams:stream-initialize") response = client.post(url) # Create a track object track = create_test_track() # Create comment url = reverse("streams:marker-create") data = { "trackUuid": str(track.uuid), "timestampMilliseconds": 420, "queueUuid": "foobarbaz", # Yes, this is on purpose! "name": "fooname", } response = client.post(url, data) # Verify response response_json = response.json() assert response_json["system"]["status"] == 200 payload = response_json["redux"]["payload"] marker = Marker.objects.get(uuid=payload["marker"]["uuid"]) assert payload["marker"]["uuid"] == str(marker.uuid) assert payload["marker"]["name"] == data["name"] assert payload["marker"]["trackUuid"] == data["trackUuid"] # cast json response to int to match original payload assert (int(payload["marker"]["timestampMilliseconds"]) == data["timestampMilliseconds"]) # Assert database entry assert marker.user_id == user.id assert marker.name == data["name"] assert str(marker.track_id) == data["trackUuid"] assert marker.timestamp_ms == data["timestampMilliseconds"] assert not marker.deleted_at
def test_text_comment_modification_get_container( django_user_model, start_ptr, end_ptr, expected_result, ): """ Verify finding the "container" interval with all possible combinations. The container modification would be an existing modification that is the same or larger than the proposed one. """ TextComment = apps.get_model("comments", "TextComment") TextCommentModification = apps.get_model("comments", "TextCommentModification") # Initialize user credentials = { "username": "******", "password": "******", } user = django_user_model.objects.create_user(**credentials) # Create a track object track = create_test_track() text_comment = TextComment.objects.create( user=user, format=TextComment.FORMAT_TEXT, text="0123456789", track_id=track.uuid, timestamp_ms=4200, ) style = TextCommentModification.STYLE_BOLD with pgtrigger.ignore("comments.TextCommentModification:protect_inserts"): TextCommentModification.objects.create( user=user, text_comment_id=text_comment.uuid, start_ptr=3, end_ptr=7, style=style, ) contained = TextCommentModification.objects.get_container( user=user, text_comment_id=text_comment.uuid, start_ptr=start_ptr, end_ptr=end_ptr, style=style, ) assert bool(contained) == expected_result
def test_text_comment_delete_view_happy_path( client, django_user_model, mocker, ): """ Simple case for deleting (archiving) a text comment through the API. """ TextComment = apps.get_model("comments", "TextComment") # Initialize user credentials = { "username": "******", "password": "******", } user = django_user_model.objects.create_user(**credentials) # Login response = client.login(**credentials) # Initialize stream url = reverse("streams:stream-initialize") response = client.post(url) # Create a track object track = create_test_track() # Create comment text_comment = TextComment.objects.create( user=user, format=TextComment.FORMAT_TEXT, text="Hello, world!", track_id=track.uuid, timestamp_ms=4200, ) assert not text_comment.deleted_at # Delete comment url = reverse("comments:text-comment-delete") data = { "textCommentUuid": text_comment.uuid, } response = client.post(url, data) # Verify response response_json = response.json() assert response_json["system"]["status"] == 200 assert False text_comment.refresh_from_db() assert text_comment.deleted_at
def test_text_comment_modification_get_upper_overlap( django_user_model, start_ptr, end_ptr, expected_result, ): """ Verify each case validate expected upper bound overlap. """ TextComment = apps.get_model("comments", "TextComment") TextCommentModification = apps.get_model("comments", "TextCommentModification") # Initialize user credentials = { "username": "******", "password": "******", } user = django_user_model.objects.create_user(**credentials) # Create a track object track = create_test_track() text_comment = TextComment.objects.create( user=user, format=TextComment.FORMAT_TEXT, text="0123456789", track_id=track.uuid, timestamp_ms=4200, ) style = TextCommentModification.STYLE_BOLD with pgtrigger.ignore("comments.TextCommentModification:protect_inserts"): TextCommentModification.objects.create( user=user, text_comment_id=text_comment.uuid, start_ptr=3, end_ptr=7, style=style, ) upper_overlap = TextCommentModification.objects.get_upper_overlap( user=user, text_comment_id=text_comment.uuid, start_ptr=start_ptr, end_ptr=end_ptr, style=style, ) assert bool(upper_overlap) == expected_result
def test_text_comment_modification_create_view_happy_path( client, django_user_model, mocker, ): """ Simple test that lists all text comments for a given track. """ TextComment = apps.get_model("comments", "TextComment") TextCommentModification = apps.get_model("comments", "TextCommentModification") # Initialize user credentials = { "username": "******", "password": "******", } user = django_user_model.objects.create_user(**credentials) # Login response = client.login(**credentials) # Initialize stream url = reverse("streams:stream-initialize") response = client.post(url) # Create a track object track = create_test_track() # Create comment text_comment = TextComment.objects.create( user=user, format=TextComment.FORMAT_TEXT, text="Hello, world!", track_id=track.uuid, timestamp_ms=4200, ) assert not text_comment.deleted_at # Create text comment modification url = reverse("comments:text-comment-modification-create") data = { "textCommentUuid": text_comment.uuid, "style": TextCommentModification.STYLE_BOLD, "anchorOffset": 0, "focusOffset": 5, } response = client.post(url, data) # Verify response response_json = response.json() assert response_json["system"]["status"] == 200 assert response_json["redux"]["type"] == "textCommentModification/create" payload = response_json["redux"]["payload"] assert payload["textCommentUuid"] == str(text_comment.uuid) # Meaning, no modifications were deleted assert not payload["textCommentModifications"]["deleted"] TextCommentModification.objects.get( uuid=payload["textCommentModifications"]["modified"]["uuid"], user=user, text_comment=text_comment, start_ptr=data["anchorOffset"], end_ptr=data["focusOffset"], style=data["style"], deleted_at__isnull=True, )
def test_text_comment_modification_list_delete_view_happy_path( client, django_user_model, mocker, text_comment_modification_count, ): """ Assert that /comments/text-comment/create/ only allows requests of type PUT. """ TextComment = apps.get_model("comments", "TextComment") TextCommentModification = apps.get_model("comments", "TextCommentModification") # Initialize user credentials = { "username": "******", "password": "******", } user = django_user_model.objects.create_user(**credentials) # Login response = client.login(**credentials) # Initialize stream url = reverse("streams:stream-initialize") response = client.post(url) # Create a track object track = create_test_track() # Create comment text_comment = TextComment.objects.create( user=user, format=TextComment.FORMAT_TEXT, text="Hello, world!", track_id=track.uuid, timestamp_ms=4200, ) assert not text_comment.deleted_at # Create text comment modification with pgtrigger.ignore("comments.TextCommentModification:protect_inserts"): text_comment_modifications = [] for idx in range(text_comment_modification_count): text_comment_modification = TextCommentModification.objects.create( user=user, text_comment=text_comment, start_ptr=(idx * 2), end_ptr=(idx * 2 + 2), style=TextCommentModification.STYLE_BOLD, ) assert not text_comment_modification.deleted_at text_comment_modifications.append(text_comment_modification) # Create text comment modification url = reverse("comments:text-comment-modification-list-delete") data = { "textCommentUuid": text_comment.uuid, } response = client.post(url, data) # Verify response response_json = response.json() assert response_json["system"]["status"] == 200 assert False for text_comment_modification in text_comment_modifications: text_comment_modification.refresh_from_db() assert text_comment_modification.deleted_at