[scrobbles] Share log data on shared scrobble links (46de9f0e)

This commit is contained in:
2026-08-07 20:19:32 -04:00
parent c61823f881
commit dc17a285c1
5 changed files with 285 additions and 63 deletions

View File

@ -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(