diff --git a/swh/web/common/origin_visits.py b/swh/web/common/origin_visits.py --- a/swh/web/common/origin_visits.py +++ b/swh/web/common/origin_visits.py @@ -125,10 +125,13 @@ return visits[0] if not visit_ts: - # returns the latest visit with a valid snapshot when no timestamp is provided - for v in reversed(visits): - if v["snapshot"] is not None: - return v + # returns the latest full visit with a valid snapshot or + # the latest partial visit with a valid snapshot otherwise + for status in ("full", "partial"): + visits_filtered = [v for v in visits if v["status"] == status] + for v in reversed(visits_filtered): + if v["snapshot"] is not None: + return v return visits[-1] target_visit_ts = math.floor(parse_timestamp(visit_ts).timestamp()) diff --git a/swh/web/tests/common/test_origin_visits.py b/swh/web/tests/common/test_origin_visits.py --- a/swh/web/tests/common/test_origin_visits.py +++ b/swh/web/tests/common/test_origin_visits.py @@ -194,3 +194,83 @@ assert visit["snapshot"] is not None assert visit["visit"] == 17 + + +def test_get_origin_visit_latest_valid_full_snapshot(mocker): + mock_origin_visits = mocker.patch("swh.web.common.origin_visits.get_origin_visits") + origin_info = { + "url": "https://github.com/baifanwudi/PythonCode", + } + visits = [ + { + "origin": "https://github.com/baifanwudi/PythonCode", + "date": "2015-08-20T21:10:30.878463+00:00", + "type": "git", + "visit": 1, + "status": "full", + "snapshot": "19251779232ae093b630ab7a38706f1c09318329", + }, + { + "origin": "https://github.com/baifanwudi/PythonCode", + "date": "2016-02-23T18:12:41.962534+00:00", + "type": "git", + "visit": 2, + "status": "full", + "snapshot": "f03e34b0acf6f18af61a14f3b3f16d3f6bce12d7", + }, + { + "origin": "https://github.com/baifanwudi/PythonCode", + "date": "2016-03-28T00:32:18.582729+00:00", + "type": "git", + "visit": 3, + "status": "full", + "snapshot": "f03e34b0acf6f18af61a14f3b3f16d3f6bce12d7", + }, + { + "origin": "https://github.com/baifanwudi/PythonCode", + "date": "2016-08-31T09:31:27.008337+00:00", + "type": "git", + "visit": 4, + "status": "partial", + "snapshot": "1a8893e6a86f444e8be8e7bda6cb34fb1735a00e", + }, + { + "origin": "https://github.com/baifanwudi/PythonCode", + "date": "2016-09-14T22:32:04.504012+00:00", + "type": "git", + "visit": 5, + "status": "partial", + "snapshot": "1a8893e6a86f444e8be8e7bda6cb34fb1735a00e", + }, + { + "origin": "https://github.com/baifanwudi/PythonCode", + "date": "2017-04-23T17:02:02.995780+00:00", + "type": "git", + "visit": 6, + "status": "partial", + "snapshot": "1a8893e6a86f444e8be8e7bda6cb34fb1735a00e", + }, + { + "origin": "https://github.com/baifanwudi/PythonCode", + "date": "2018-02-17T14:13:04.174283+00:00", + "type": "git", + "visit": 7, + "status": "partial", + "snapshot": None, + }, + { + "origin": "https://github.com/baifanwudi/PythonCode", + "date": "2019-03-16T02:59:56.762202+00:00", + "type": "git", + "visit": 8, + "status": "partial", + "snapshot": None, + }, + ] + + mock_origin_visits.return_value = visits + + visit = get_origin_visit(origin_info) + + assert visit["snapshot"] is not None + assert visit["visit"] == 3