1
1
# Copyright 2010 Canonical Ltd. This software is licensed under the
2
2
# GNU Affero General Public License version 3 (see the file LICENSE).
3
from datetime import datetime, timedelta
3
from datetime import datetime, timedelta, date
5
5
from operator import attrgetter
296
296
project=project, durations=[25, 25],
297
297
result=ProjectBuildStates.SUCCESS)
299
started_at = datetime.now() - timedelta(minutes=10)
299
300
build_result = factory.make_build_result(
300
project=project, result=ProjectBuildStates.PENDING)
301
started_at = datetime.now() - timedelta(minutes=10)
302
build_result.started_at = started_at
305
builder = Lexbuilder.objects.create(current_job=build_result)
301
project=project, result=ProjectBuildStates.PENDING,
302
started_at=started_at)
303
builder = factory.make_lexbuilder(current_job=build_result)
307
305
datetime_mock = self.mocker.replace(datetime)
308
306
datetime_mock.now()
323
321
project = factory.make_project()
323
started_at = datetime.now() - timedelta(minutes=10)
325
324
build_result = factory.make_build_result(
326
project=project, result=ProjectBuildStates.PENDING)
327
started_at = datetime.now() - timedelta(minutes=10)
328
build_result.started_at = started_at
325
project=project, result=ProjectBuildStates.PENDING,
326
started_at=started_at)
331
builder = Lexbuilder.objects.create(current_job=build_result)
328
builder = factory.make_lexbuilder(current_job=build_result)
333
330
self.assertEqual("Unknown", builder.estimated_completion)
335
332
def test_estimated_completion_with_no_current_build(self):
337
If the average cannot be determined because there are no builds, we
338
should get "Unknown" as the estimated completion time.
334
If there is no current build, then we should get "No build in
335
progress" for the estimated completion time.
340
builder = Lexbuilder.objects.create()
337
builder = factory.make_lexbuilder(current_job=None)
341
338
self.assertEqual("No build in progress", builder.estimated_completion)
343
340
def test_estimated_completion_negative_time(self):
368
365
# Started 10 minutes ago (started_at + timedelta(minutes=10))
369
366
self.assertEqual("ASAP", builder.estimated_completion)
368
def test_average_load(self):
370
Lexbuilder.average_load should calculate the total time used by builds
371
as a percentage of the time available.
373
builder = factory.make_lexbuilder()
374
project = factory.make_project()
375
create_build_results_with_durations(
376
project, [50, 50], result=ProjectBuildStates.SUCCESS,
377
build_date=date.today() - timedelta(days=2),
379
# 50 minutes * 60 seconds + 50 minutes * 60 seconds / (24 * 60 * 60)
381
self.assertEqual(6.94, round(builder.average_load, 2))
383
def test_average_load_buildresults_today(self):
385
Lexbuilder.average_load should ignore buildresults from today.
387
builder = factory.make_lexbuilder()
388
project = factory.make_project()
389
# Cheat build_date to tomorrow, because it sets the start_date to
390
# build_date - 10 minutes.
391
create_build_results_with_durations(
392
project, [50, 50], build_date=date.today() + timedelta(days=1),
393
result=ProjectBuildStates.SUCCESS, builder=builder)
394
self.assertEqual(None, builder.average_load)
371
396
def test_lexbuilder_without_current_job(self):
373
398
A Lexbuilder with no current_job is not considered private and thus
374
399
is visible to anyone.
376
builder = factory.make_lexbuilder()
377
# Must manually set current_job to None because the above call will
378
# create an arbitrary BuildResult and assign it to the newly created
379
# builder's current_job.
380
builder.current_job = None
401
builder = factory.make_lexbuilder(current_job=None)
382
402
user = factory.make_user()
383
403
self.assertEqual(False, builder.is_private)
384
404
self.assertEqual(True, builder.is_visible_to(user))