Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions providers/facebook.py
Original file line number Diff line number Diff line change
Expand Up @@ -481,12 +481,12 @@ def get_post_metrics(self, access_token: str, post_id: str) -> PostMetrics:
shares = self._share_count(fields)

return PostMetrics(
reach=values.get("post_media_view", 0),
reach=values.get("post_total_media_view_unique", 0),
clicks=values.get("post_clicks", 0),
likes=0,
comments=comments,
shares=shares,
video_views=values.get("post_total_media_view_unique", 0),
video_views=values.get("post_media_view", 0),
extra={
"reactions": reactions_total,
"raw_fields": fields,
Expand Down
12 changes: 10 additions & 2 deletions providers/meta_insights.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,22 @@

def parse_insights_response(data: dict[str, Any]) -> dict[str, Any]:
values: dict[str, Any] = {}
periods: dict[str, str] = {}
for entry in data.get("data", []):
name = entry.get("name", "")
if not name:
continue
period = entry.get("period", "")
if periods.get(name) == "lifetime" and period != "lifetime":
continue
if "total_value" in entry:
values[name] = entry.get("total_value", {}).get("value", 0)
value = entry.get("total_value", {}).get("value", 0)
else:
value = entry.get("values", [{}])[0].get("value", 0)
if name not in values or period == "lifetime":
values[name] = value
periods[name] = period
continue
values[name] = entry.get("values", [{}])[0].get("value", 0)
return values


Expand Down
16 changes: 8 additions & 8 deletions tests/providers/test_facebook.py
Original file line number Diff line number Diff line change
Expand Up @@ -318,8 +318,8 @@ def test_get_post_metrics_uses_v25_media_view_metrics_and_object_counts():

metrics = provider.get_post_metrics("page-token", "page-1_post-1")

assert metrics.reach == 54
assert metrics.video_views == 42
assert metrics.reach == 42
assert metrics.video_views == 54
assert metrics.clicks == 4
assert metrics.likes == 0
assert metrics.comments == 5
Expand Down Expand Up @@ -420,8 +420,8 @@ def test_get_post_metrics_resolves_photo_id_to_feed_post_for_comments_and_shares

metrics = provider.get_post_metrics("page-token", "photo-1")

assert metrics.reach == 500
assert metrics.video_views == 300
assert metrics.reach == 300
assert metrics.video_views == 500
assert metrics.clicks == 20
assert metrics.comments == 4
assert metrics.shares == 2
Expand Down Expand Up @@ -462,8 +462,8 @@ def test_get_post_metrics_tries_page_scoped_feed_id_for_numeric_object_id():

metrics = provider.get_post_metrics("page-token", "1668168861075953")

assert metrics.reach == 90
assert metrics.video_views == 70
assert metrics.reach == 70
assert metrics.video_views == 90
assert metrics.comments == 6
assert metrics.shares == 8
assert metrics.extra["insight_post_id"] == "page-1_1668168861075953"
Expand Down Expand Up @@ -501,8 +501,8 @@ def test_get_post_metrics_tries_next_candidate_when_feed_id_has_no_insights_edge

metrics = provider.get_post_metrics("page-token", "1668168861075953")

assert metrics.reach == 12
assert metrics.video_views == 10
assert metrics.reach == 10
assert metrics.video_views == 12
assert metrics.comments == 2
assert metrics.extra["insight_post_id"] == "1668168861075953"
assert metrics.extra["attempted_insight_post_ids"] == ["page-1_1668168861075953", "1668168861075953"]
Expand Down
4 changes: 2 additions & 2 deletions tests/providers/test_instagram.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,8 +200,8 @@ def test_instagram_media_metrics_use_current_metrics_and_field_fallbacks():

metrics = provider.get_post_metrics("page-token", "ig-media-1")

assert metrics.video_views == 400
assert metrics.reach == 250
assert metrics.video_views == 250
assert metrics.reach == 400
assert metrics.likes == 12
assert metrics.comments == 3
assert metrics.saves == 5
Expand Down
34 changes: 33 additions & 1 deletion tests/providers/test_meta_insights.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import pytest

from providers.exceptions import APIError
from providers.meta_insights import fetch_insights_safe
from providers.meta_insights import fetch_insights_safe, parse_insights_response


def _resp(data):
Expand Down Expand Up @@ -60,3 +60,35 @@ def test_fetch_insights_safe_reraises_permission_errors():
)

assert excinfo.value is permission_error


def test_parse_insights_response_prefers_lifetime_when_metric_name_repeats():
values = parse_insights_response(
{
"data": [
{
"name": "post_media_view",
"period": "lifetime",
"values": [{"value": 32741}],
},
{
"name": "post_total_media_view_unique",
"period": "lifetime",
"values": [{"value": 21105}],
},
{
"name": "post_total_media_view_unique",
"period": "day",
"values": [
{"value": 0, "end_time": "2026-06-21T07:00:00+0000"},
{"value": 0, "end_time": "2026-06-22T07:00:00+0000"},
],
},
]
}
)

assert values == {
"post_media_view": 32741,
"post_total_media_view_unique": 21105,
}
Loading