def test_pending_result_does_not_change_num_fails(self): """Inserting a new pending result should not change num_fails. If we already have a results row for a resource, then we change that row to make a pending result, this should not change num_fails or other fields. """ # Make a resource with 1 success then 3 consecutive fails. results.upsert("test_resource_id", True) last_successful = results.get("test_resource_id")["last_successful"] results.upsert("test_resource_id", False) results.upsert("test_resource_id", False) results.upsert("test_resource_id", False) num_fails = results.get("test_resource_id")["num_fails"] last_checked = results.get("test_resource_id")["last_checked"] before = datetime.datetime.utcnow() results._make_pending(["test_resource_id"]) after = datetime.datetime.utcnow() result = results.get("test_resource_id") assert result["num_fails"] == num_fails assert result["last_successful"] == last_successful assert result["last_checked"] == last_checked assert result["alive"] is False assert result["pending"] is True assert strptime(result["pending_since"]) > before assert strptime(result["pending_since"]) < after
def test_make_pending_does_not_change_status_or_reason(self): """Marking a result as pending should not change status or reason. Marking a result as pending just says "we are expecting a new result for this resource soon", it should not change the existing results. """ results.upsert("test_resource_id", True, status=200, reason="OK") last_successful = results.get("test_resource_id")["last_successful"] results.upsert("test_resource_id", False, status=401, reason="Unauthorized") last_checked = results.get("test_resource_id")["last_checked"] results._make_pending(["test_resource_id"]) result = results.get("test_resource_id") assert result["num_fails"] == 1 assert result["last_successful"] == last_successful assert result["last_checked"] == last_checked assert result["alive"] is False assert result["pending"] is True assert result["status"] == 401 assert result["reason"] == "Unauthorized"
def test_that_it_does_not_return_resources_with_pending_checks(self): """Resources with pending checks < 2 hours old should not be returned. """ now = datetime.datetime.utcnow() # Create 5 resources that have been checked in the last 24 hours. resource_1 = factories.Resource()['id'] resource_2 = factories.Resource()['id'] resource_3 = factories.Resource()['id'] resource_4 = factories.Resource()['id'] resource_5 = factories.Resource()['id'] twenty_hours_ago = now - datetime.timedelta(hours=20) results.upsert(resource_1, True, last_checked=twenty_hours_ago) results.upsert(resource_2, True, last_checked=twenty_hours_ago) results.upsert(resource_3, True, last_checked=twenty_hours_ago) results.upsert(resource_4, True, last_checked=twenty_hours_ago) results.upsert(resource_5, True, last_checked=twenty_hours_ago) # Create 5 resources with pending checks from < 2 hours ago. resource_6 = factories.Resource()['id'] resource_7 = factories.Resource()['id'] resource_8 = factories.Resource()['id'] resource_9 = factories.Resource()['id'] resource_10 = factories.Resource()['id'] one_hour_ago = now - datetime.timedelta(hours=1) results._make_pending( [resource_6, resource_7, resource_8, resource_9, resource_10], one_hour_ago) # Create 5 resources that were last checked more than 24 hours ago. resource_11 = factories.Resource()['id'] resource_12 = factories.Resource()['id'] resource_13 = factories.Resource()['id'] resource_14 = factories.Resource()['id'] resource_15 = factories.Resource()['id'] results.upsert(resource_11, True, last_checked=now - datetime.timedelta(hours=35)) results.upsert(resource_12, True, last_checked=now - datetime.timedelta(hours=34)) results.upsert(resource_13, True, last_checked=now - datetime.timedelta(hours=33)) results.upsert(resource_14, True, last_checked=now - datetime.timedelta(hours=32)) results.upsert(resource_15, True, last_checked=now - datetime.timedelta(hours=31)) resources_to_check = results.get_resources_to_check(10) assert resources_to_check == [ resource_11, resource_12, resource_13, resource_14, resource_15 ]
def test_custom_longer_pending_since(self): """If given a longer ``pending_since`` time it should not return resources that have more recent pending checks.""" test_resource = factories.Resource()['id'] three_hours_ago = datetime.datetime.utcnow() - datetime.timedelta( hours=3) results._make_pending([test_resource], three_hours_ago) results_ = results.get_resources_to_check( 10, pending_since=datetime.timedelta(hours=4)) assert results_ == []
def test_custom_shorter_pending_since(self): """If given a shorter ``pending_since`` time it should return resources that have more recent pending checks.""" test_resource = factories.Resource()['id'] one_hour_ago = datetime.datetime.utcnow() - datetime.timedelta(hours=1) results._make_pending([test_resource], one_hour_ago) results_ = results.get_resources_to_check( 10, pending_since=datetime.timedelta(hours=0.5)) assert len(results_) == 1 assert results_[0] == test_resource
def test_custom_shorter_pending_since(self): """If given a shorter ``pending_since`` time it should return resources that have more recent pending checks.""" test_resource = factories.Resource()['id'] one_hour_ago = datetime.datetime.utcnow() - datetime.timedelta( hours=1) results._make_pending([test_resource], one_hour_ago) results_ = results.get_resources_to_check( 10, pending_since=datetime.timedelta(hours=0.5)) assert len(results_) == 1 assert results_[0] == test_resource
def test_that_it_does_not_return_resources_with_pending_checks(self): """Resources with pending checks < 2 hours old should not be returned. """ now = datetime.datetime.utcnow() # Create 5 resources that have been checked in the last 24 hours. resource_1 = factories.Resource()['id'] resource_2 = factories.Resource()['id'] resource_3 = factories.Resource()['id'] resource_4 = factories.Resource()['id'] resource_5 = factories.Resource()['id'] twenty_hours_ago = now - datetime.timedelta(hours=20) results.upsert(resource_1, True, last_checked=twenty_hours_ago) results.upsert(resource_2, True, last_checked=twenty_hours_ago) results.upsert(resource_3, True, last_checked=twenty_hours_ago) results.upsert(resource_4, True, last_checked=twenty_hours_ago) results.upsert(resource_5, True, last_checked=twenty_hours_ago) # Create 5 resources with pending checks from < 2 hours ago. resource_6 = factories.Resource()['id'] resource_7 = factories.Resource()['id'] resource_8 = factories.Resource()['id'] resource_9 = factories.Resource()['id'] resource_10 = factories.Resource()['id'] one_hour_ago = now - datetime.timedelta(hours=1) results._make_pending( [resource_6, resource_7, resource_8, resource_9, resource_10], one_hour_ago) # Create 5 resources that were last checked more than 24 hours ago. resource_11 = factories.Resource()['id'] resource_12 = factories.Resource()['id'] resource_13 = factories.Resource()['id'] resource_14 = factories.Resource()['id'] resource_15 = factories.Resource()['id'] results.upsert(resource_11, True, last_checked=now - datetime.timedelta(hours=35)) results.upsert(resource_12, True, last_checked=now - datetime.timedelta(hours=34)) results.upsert(resource_13, True, last_checked=now - datetime.timedelta(hours=33)) results.upsert(resource_14, True, last_checked=now - datetime.timedelta(hours=32)) results.upsert(resource_15, True, last_checked=now - datetime.timedelta(hours=31)) resources_to_check = results.get_resources_to_check(10) assert resources_to_check == [resource_11, resource_12, resource_13, resource_14, resource_15]
def test_initial_pending_result(self): """Test creating a pending result for a resource that has no results. """ before = datetime.datetime.utcnow() results._make_pending(["test_resource_id"]) after = datetime.datetime.utcnow() result = results.get("test_resource_id") assert result["num_fails"] == 0 assert result["last_successful"] is None assert result["last_checked"] is None assert result["alive"] is None assert result["pending"] is True assert strptime(result["pending_since"]) > before assert strptime(result["pending_since"]) < after
def test_that_it_does_return_resources_with_expired_pending_checks(self): """Resources with pending checks > 2 hours old should be returned. And they should be sorted oldest-pending-check-first. """ # Create 5 resources with pending checks from > 2 hours ago. resource_1 = factories.Resource()['id'] resource_2 = factories.Resource()['id'] resource_3 = factories.Resource()['id'] resource_4 = factories.Resource()['id'] resource_5 = factories.Resource()['id'] five_hours_ago = datetime.datetime.utcnow() - datetime.timedelta( hours=5) results._make_pending( [resource_1, resource_2, resource_3, resource_4, resource_5], five_hours_ago) resources_to_check = results.get_resources_to_check(10) assert resources_to_check == [resource_1, resource_2, resource_3, resource_4, resource_5]
def test_that_it_does_return_resources_with_expired_pending_checks(self): """Resources with pending checks > 2 hours old should be returned. And they should be sorted oldest-pending-check-first. """ # Create 5 resources with pending checks from > 2 hours ago. resource_1 = factories.Resource()['id'] resource_2 = factories.Resource()['id'] resource_3 = factories.Resource()['id'] resource_4 = factories.Resource()['id'] resource_5 = factories.Resource()['id'] five_hours_ago = datetime.datetime.utcnow() - datetime.timedelta( hours=5) results._make_pending( [resource_1, resource_2, resource_3, resource_4, resource_5], five_hours_ago) resources_to_check = results.get_resources_to_check(10) assert resources_to_check == [ resource_1, resource_2, resource_3, resource_4, resource_5 ]
def test_that_it_creates_pending_checks(self): """get_resources_to_check() should create pending link checker results for all the resources it returns.""" # A resource that has never been checked. resource_1 = factories.Resource()['id'] # A resource that was checked > 24 hours ago. resource_2 = factories.Resource()['id'] thirty_hours_ago = datetime.datetime.utcnow() - datetime.timedelta( hours=30) results.upsert(resource_2, True, last_checked=thirty_hours_ago) # A resource with a pending check from > 2 hours ago. resource_3 = factories.Resource()['id'] three_hours_ago = datetime.datetime.utcnow() - datetime.timedelta( hours=3) results._make_pending([resource_3], three_hours_ago) results.get_resources_to_check(10) for resource in (resource_1, resource_2, resource_3): result = results.get(resource) assert result["pending"] is True