fix(files): a file is added when it is done, not when it was asked for
A download that failed for days and then went through sat days down the library, under its request date, and read as missing. A job now records when it became done (`ready_at`), stamped where the expiry already is (`folders.stamp_done`, `finalize_if_running`) and on an insert that is already done; a check constraint holds every path to done to it. The library sorts and dates its "Added" by it; the queue keeps the request order. The migration dates a file from before by its "ready to watch" notice where the inbox still holds one, else by its request date, where it already sat.
This commit is contained in:
@@ -59,7 +59,7 @@ def _file(db, user_id, *, kind="youtube", ref=None, title="A title", size=10, re
|
||||
db.add(job)
|
||||
db.flush()
|
||||
folders.place(db, job)
|
||||
folders.stamp_expiry(db, job)
|
||||
folders.stamp_done(db, job)
|
||||
service.incr_ref_count(db, asset.id)
|
||||
db.commit()
|
||||
return job
|
||||
@@ -245,6 +245,38 @@ def test_the_list_sorts_by_name_size_or_when_added(db, make_user, as_user):
|
||||
assert ids(sort="size", order="desc") == [b.id, z.id, a.id]
|
||||
|
||||
|
||||
def test_a_file_is_added_when_it_is_done_not_when_it_was_asked_for(db, make_user, as_user):
|
||||
"""A download that failed for days and then went through is new: it lists first, dated today."""
|
||||
alice = make_user()
|
||||
early = _file(db, alice.id, created_at=NOW - timedelta(days=1))
|
||||
early.ready_at = NOW - timedelta(days=1)
|
||||
late = _file(db, alice.id, status=JobStatus.RUNNING, created_at=NOW - timedelta(days=5))
|
||||
late.ready_at = None
|
||||
db.commit()
|
||||
assert service.finalize_if_running(db, late.id, status=JobStatus.DONE)
|
||||
db.commit()
|
||||
db.expire_all() # the finalize is a Core UPDATE; the route reads this same session
|
||||
got = as_user(alice).get("/api/files").json()
|
||||
assert [f["id"] for f in got] == [late.id, early.id]
|
||||
ready = datetime.fromisoformat(got[0]["ready_at"])
|
||||
assert ready > NOW - timedelta(minutes=5)
|
||||
assert datetime.fromisoformat(got[0]["created_at"]) < NOW - timedelta(days=4)
|
||||
|
||||
|
||||
def test_a_job_made_done_is_ready_as_it_is_made(db, make_user):
|
||||
# An upload kept as it came is inserted done; the database refuses a done job without the moment.
|
||||
job = DownloadJob(
|
||||
user_id=make_user().id,
|
||||
source_kind="upload",
|
||||
source_ref="r",
|
||||
profile_snapshot={},
|
||||
status=JobStatus.DONE,
|
||||
)
|
||||
db.add(job)
|
||||
db.commit()
|
||||
assert job.ready_at is not None
|
||||
|
||||
|
||||
def test_shared_with_me_lists_what_others_shared_and_nothing_else(db, make_user, as_user):
|
||||
alice, bob, carol = make_user(), make_user(), make_user()
|
||||
theirs = _file(db, bob.id)
|
||||
|
||||
Reference in New Issue
Block a user