[scrobbles] Share log data on shared scrobble links (46de9f0e)
This commit is contained in:
@ -3,6 +3,7 @@ from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
import time_machine
|
||||
from agents.models import AgentSession
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.urls import reverse
|
||||
from django.utils import timezone
|
||||
@ -12,6 +13,7 @@ from scrobbles.models import Scrobble, ShareViewLog
|
||||
from scrobbles.sqids import encode_scrobble_share
|
||||
from tasks.models import Task
|
||||
from videos.models import Channel, Video
|
||||
from workouts.models import Exercise, WorkoutRoutine
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@ -856,6 +858,136 @@ def test_share_view_increments_count_and_logs_view(client):
|
||||
assert log_entry.referrer == ""
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_share_view_shows_agent_session_logdata(client):
|
||||
user = get_user_model().objects.create_user(
|
||||
username="shareagentsession", password="testpass"
|
||||
)
|
||||
agent_session, _ = AgentSession.find_or_create(
|
||||
provider="opencode", model="opencode"
|
||||
)
|
||||
scrobble = Scrobble.objects.create(
|
||||
agent_session=agent_session,
|
||||
media_type="AgentSession",
|
||||
user=user,
|
||||
visibility="shared",
|
||||
timestamp=timezone.now(),
|
||||
log={
|
||||
"title": "Hello agent",
|
||||
"provider": "opencode",
|
||||
"model": "opencode",
|
||||
"turns": [
|
||||
{
|
||||
"prompt_id": "abc-1",
|
||||
"prompt": "What is the capital of France?",
|
||||
"response": "Paris",
|
||||
}
|
||||
],
|
||||
},
|
||||
)
|
||||
url = reverse(
|
||||
"scrobbles:shared-detail",
|
||||
kwargs={"sqid": encode_scrobble_share(scrobble.id, scrobble.share_token_version)},
|
||||
)
|
||||
response = client.get(url)
|
||||
assert response.status_code == 200
|
||||
content = response.content.decode()
|
||||
assert "What is the capital of France?" in content
|
||||
assert "Paris" in content
|
||||
# Shared page must not expose the owner's follow-up/retry UI
|
||||
assert "Ask a follow-up" not in content
|
||||
assert "/follow-up/" not in content
|
||||
assert "Retry" not in content
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_share_view_strips_sensitive_logdata(client):
|
||||
user = get_user_model().objects.create_user(
|
||||
username="sharesensitive", password="testpass"
|
||||
)
|
||||
task = Task.objects.create(title="Weigh-in")
|
||||
scrobble = Scrobble.objects.create(
|
||||
task=task,
|
||||
media_type="Task",
|
||||
user=user,
|
||||
visibility="shared",
|
||||
timestamp=timezone.now(),
|
||||
log={
|
||||
"weight": 82.5,
|
||||
"body_fat": 18.0,
|
||||
"waist": 88.0,
|
||||
"comment": "feeling good",
|
||||
},
|
||||
)
|
||||
url = reverse(
|
||||
"scrobbles:shared-detail",
|
||||
kwargs={"sqid": encode_scrobble_share(scrobble.id, scrobble.share_token_version)},
|
||||
)
|
||||
response = client.get(url)
|
||||
assert response.status_code == 200
|
||||
content = response.content.decode()
|
||||
assert "82.5" in content
|
||||
assert "feeling good" in content
|
||||
assert "18.0" not in content
|
||||
assert "88.0" not in content
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_share_view_owner_logdata_unchanged():
|
||||
user = get_user_model().objects.create_user(
|
||||
username="ownerlogdata", password="testpass"
|
||||
)
|
||||
task = Task.objects.create(title="Weigh-in")
|
||||
scrobble = Scrobble.objects.create(
|
||||
task=task,
|
||||
media_type="Task",
|
||||
user=user,
|
||||
visibility="shared",
|
||||
timestamp=timezone.now(),
|
||||
log={
|
||||
"weight": 82.5,
|
||||
"body_fat": 18.0,
|
||||
},
|
||||
)
|
||||
assert scrobble.log["body_fat"] == 18.0
|
||||
assert "body_fat" not in scrobble.public_log
|
||||
assert scrobble.public_log["weight"] == 82.5
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_share_view_shows_workout_logdata(client):
|
||||
user = get_user_model().objects.create_user(
|
||||
username="shareworkout", password="testpass"
|
||||
)
|
||||
exercise = Exercise.objects.create(name="Deadlift")
|
||||
routine = WorkoutRoutine.objects.create(title="Test Routine")
|
||||
scrobble = Scrobble.objects.create(
|
||||
user=user,
|
||||
workout_routine=routine,
|
||||
media_type=Scrobble.MediaType.WORKOUT,
|
||||
visibility="shared",
|
||||
timestamp=timezone.now(),
|
||||
log={
|
||||
"workouts": [
|
||||
{"exercise_id": exercise.id, "sets": 3, "reps": 10, "weight_kg": 50.0}
|
||||
],
|
||||
"duration_minutes": 45,
|
||||
"bodyweight_kg": 80.0,
|
||||
},
|
||||
)
|
||||
url = reverse(
|
||||
"scrobbles:shared-detail",
|
||||
kwargs={"sqid": encode_scrobble_share(scrobble.id, scrobble.share_token_version)},
|
||||
)
|
||||
response = client.get(url)
|
||||
assert response.status_code == 200
|
||||
content = response.content.decode()
|
||||
assert "Workout Details" in content
|
||||
assert "Deadlift" in content
|
||||
assert "3 x 10" in content
|
||||
assert "80.0" not in content
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_explore_view_shows_only_public_scrobbles(client):
|
||||
user = get_user_model().objects.create_user(
|
||||
|
||||
Reference in New Issue
Block a user