#! /usr/bin/env python3
#
# BitBake Toaster Implementation
#
# Copyright (C) 2013-2016 Intel Corporation
#
# SPDX-License-Identifier: GPL-2.0-only
#

from django.core.urlresolvers import reverse
from django.utils import timezone
from tests.browser.selenium_helpers import SeleniumTestCase
from orm.models import Project, Build, Recipe, Task, Layer, Layer_Version
from orm.models import Target

class TestBuilddashboardPageTasks(SeleniumTestCase):
    """ Test build dashboard tasks sub-page """

    def setUp(self):
        project = Project.objects.get_or_create_default_project()

        now = timezone.now()

        self.build = Build.objects.create(project=project,
                                          started_on=now,
                                          completed_on=now)

        layer = Layer.objects.create()

        layer_version = Layer_Version.objects.create(layer=layer)

        recipe = Recipe.objects.create(layer_version=layer_version)

        task = Task.objects.create(build=self.build, recipe=recipe, order=1)

        Target.objects.create(build=self.build, task=task, target='do_build')

    def test_build_tasks_columns(self):
        """
        Check that non-hideable columns of the table on the tasks sub-page
        are disabled on the edit columns dropdown.
        """
        url = reverse('tasks', args=(self.build.id,))
        self.get(url)

        self.wait_until_visible('#edit-columns-button')

        # check that options for the non-hideable columns are disabled
        non_hideable = ['order', 'task_name', 'recipe__name']

        for column in non_hideable:
            selector = 'input#checkbox-%s[disabled="disabled"]' % column
            self.wait_until_present(selector)
