aboutsummaryrefslogtreecommitdiffstats
path: root/bitbake/lib/toaster/tests/browser/test_search.py
blob: a56fd8889ec9950ae2d94a41ece25e4cbe0e8f6e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#! /usr/bin/env python
# ex:ts=4:sw=4:sts=4:et
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
#
# BitBake Toaster Implementation
#
# Copyright (C) 2013-2016 Intel Corporation
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

from django.core.urlresolvers import reverse
from tests.browser.selenium_helpers import SeleniumTestCase, Wait

from orm.models import BitbakeVersion, Release, Project, Layer, Layer_Version
from orm.models import ProjectLayer

class TestSearch(SeleniumTestCase):
    def setUp(self):
        """ Create a project with layers so we can search its layers page """
        bitbake_version = BitbakeVersion.objects.create(name='bb1')

        release = Release.objects.create(
            name='v1',
            bitbake_version=bitbake_version
        )

        self.project = Project.objects.create(name='foo', release=release)

        layer1 = Layer.objects.create(name='layer_bar')
        layer2 = Layer.objects.create(name='layer_moo')
        layer3 = Layer.objects.create(name='layer_moo2')

        layer_version1 = Layer_Version.objects.create(
          layer=layer1,
          project=self.project
        )
        layer_version2 = Layer_Version.objects.create(
          layer=layer2,
          project=self.project
        )
        layer_version3 = Layer_Version.objects.create(
          layer=layer3,
          project=self.project
        )

        project_layer1 = ProjectLayer.objects.create(
          project=self.project,
          layercommit=layer_version1
        )
        project_layer2 = ProjectLayer.objects.create(
          project=self.project,
          layercommit=layer_version2
        )
        project_layer3 = ProjectLayer.objects.create(
          project=self.project,
          layercommit=layer_version3
        )

    def _get_last_layer_name_cell_id(self):
        """
        Get the Selenium ID of the last layer name cell in the table
        """
        cells = self.find_all('td.layer__name')
        last_cell = cells[-1]
        return last_cell.id

    def test_search_clear(self):
        """
        Show the layers page for the project, do a search, then clear it
        """
        url = reverse('projectlayers', args=(self.project.id,))
        self.get(url)

        search_box = self.find('#search-input-layerstable')
        search_box.clear()
        search_box.send_keys('moo')

        self.click('#search-submit-layerstable')

        selector = '#table-container-layerstable .remove-search-btn-layerstable'
        self.wait_until_visible(selector)

        # get the Selenium ID of the current last td element in the layer name
        # column; this will enable us to wait for the table to redraw, as its
        # ID will change on the redraw
        current_element_id = self._get_last_layer_name_cell_id()

        # click "layer" heading to sort by layer name
        selector = '#layerstable th.layer__name a'
        element = self.wait_until_visible(selector)
        element.click()

        selector = '#layerstable th.layer__name i.icon-caret-up'
        icon = self.wait_until_visible(selector)

        # when the table is sorted, the last layer name table cell is
        # redrawn, which changes its ID; wait for that to happen
        has_changed = lambda driver: \
            self._get_last_layer_name_cell_id() != current_element_id
        Wait(self.driver).until(has_changed)