From patchwork Fri Nov 10 17:26:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alassane Yattara X-Patchwork-Id: 34280 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 49160C4332F for ; Fri, 10 Nov 2023 17:26:37 +0000 (UTC) Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by mx.groups.io with SMTP id smtpd.web11.33671.1699637187612106861 for ; Fri, 10 Nov 2023 09:26:28 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@savoirfairelinux.com header.s=DFC430D2-D198-11EC-948E-34200CB392D2 header.b=dujE8s0a; spf=pass (domain: savoirfairelinux.com, ip: 208.88.110.44, mailfrom: alassane.yattara@savoirfairelinux.com) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 883C49C34CE for ; Fri, 10 Nov 2023 12:26:26 -0500 (EST) Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10032) with ESMTP id MbpeGUHk-j2S; Fri, 10 Nov 2023 12:26:26 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 1C1009C34CA; Fri, 10 Nov 2023 12:26:26 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.savoirfairelinux.com 1C1009C34CA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=savoirfairelinux.com; s=DFC430D2-D198-11EC-948E-34200CB392D2; t=1699637186; bh=TI85V8khtbmprk33aOMUsjCreVjcrl+rqvz3viKPjZs=; h=From:To:Date:Message-Id:MIME-Version; b=dujE8s0ausQrFQzW68wZyanTAXcGc+MgqPseDB5BNT2OT2uy0mrZpf++5Rv8AVNcg DmtLWcAxlCHPCTTUk2AnxoF+8+Ng0BgdoBX//ziPffhDW3hY9Rxz5FHNpxSFjzK7dN /N+ZJ13hn7kOPvalfk/bARgeM5yNaz9n8gOCIbcFP48U6fN/SKuSP0+9wftRDp2vM3 cZEb5upghdSq9drhacY+OKvDW51iThF6z4HKKJ8ER6q45DeF91mtUodBatRFgC7nTw d14og083iN/AIf0jAo6xYT+u6o8eGiMtKPE3yg1lwk53l7YfZ/wEqtnWAw5GLfv0iy czcbeDdNOUp/w== X-Virus-Scanned: amavis at mail.savoirfairelinux.com Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10026) with ESMTP id Dh3L8kPnt2sw; Fri, 10 Nov 2023 12:26:26 -0500 (EST) Received: from jedi.. (unknown [196.127.183.75]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id 5634D9C328E; Fri, 10 Nov 2023 12:26:25 -0500 (EST) From: Alassane Yattara To: bitbake-devel@lists.openembedded.org Cc: Alassane Yattara Subject: [PATCH 1/6] Toaster: Write UI TestCase -> Visualize all builds Date: Fri, 10 Nov 2023 18:26:15 +0100 Message-Id: <20231110172620.396838-1-alassane.yattara@savoirfairelinux.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Fri, 10 Nov 2023 17:26:37 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/15506 Test a message is shown when there are no build in all builds page Signed-off-by: Alassane Yattara --- lib/toaster/tests/browser/test_sample.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/toaster/tests/browser/test_sample.py b/lib/toaster/tests/browser/test_sample.py index b0067c21..73973778 100644 --- a/lib/toaster/tests/browser/test_sample.py +++ b/lib/toaster/tests/browser/test_sample.py @@ -27,3 +27,12 @@ class TestSample(SeleniumTestCase): self.get(url) brand_link = self.find('.toaster-navbar-brand a.brand') self.assertEqual(brand_link.text.strip(), 'Toaster') + + def test_no_builds_message(self): + """ Test that a message is shown when there are no builds """ + url = reverse('all-builds') + self.get(url) + div_msg = self.find('#empty-state-allbuildstable .alert-info') + + msg = 'Sorry - no data found' + self.assertEqual(div_msg.text, msg) From patchwork Fri Nov 10 17:26:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alassane Yattara X-Patchwork-Id: 34285 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8C328C05021 for ; Fri, 10 Nov 2023 17:26:37 +0000 (UTC) Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by mx.groups.io with SMTP id smtpd.web10.33403.1699637188772834071 for ; Fri, 10 Nov 2023 09:26:28 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@savoirfairelinux.com header.s=DFC430D2-D198-11EC-948E-34200CB392D2 header.b=rdL25uDd; spf=pass (domain: savoirfairelinux.com, ip: 208.88.110.44, mailfrom: alassane.yattara@savoirfairelinux.com) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id C581F9C34E1 for ; Fri, 10 Nov 2023 12:26:27 -0500 (EST) Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10032) with ESMTP id Mu5ZTRKnaGB2; Fri, 10 Nov 2023 12:26:27 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 3FC939C34CA; Fri, 10 Nov 2023 12:26:27 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.savoirfairelinux.com 3FC939C34CA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=savoirfairelinux.com; s=DFC430D2-D198-11EC-948E-34200CB392D2; t=1699637187; bh=kIEwiVjvzZ70K0VDS0bIX9+mWNuiMSLUBeif/iWD8FI=; h=From:To:Date:Message-Id:MIME-Version; b=rdL25uDdaW6mImDcNFrMVmYa0T1w/l2tQ/bI8YKqzN/u4BByJPphcG2tk8AnJMzJc HdDU68RAVOIG4iTc1PuOqkfjJBSHJm1fDxXKr1XDytEG+QKd8LRTO6IypAIiuu3bvd GUhoII64zVWIILSZt7InQI9NnLmNDNhOq/LBvXtF+/UIt6ZVTdlWho2fs+NmYho7hR HlRWzoVzRzwy142t0uEsdxq0fB/YmT3NawhItAtDHfgnIRlQHR0wczLKm+V14cQwo+ q8y0g0e8ZeF2ehJYV05vrMmTZppOEbNMLojo9eIKADzeKalRdif0F65Q3O3OmlwpzP GrAxv0B0BQHcw== X-Virus-Scanned: amavis at mail.savoirfairelinux.com Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10026) with ESMTP id iIYGwcqCBnmC; Fri, 10 Nov 2023 12:26:27 -0500 (EST) Received: from jedi.. (unknown [196.127.183.75]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id 731B69C328E; Fri, 10 Nov 2023 12:26:26 -0500 (EST) From: Alassane Yattara To: bitbake-devel@lists.openembedded.org Cc: Alassane Yattara Subject: [PATCH 2/6] Toaster: Write UI TestCase -> Visualize all builds Date: Fri, 10 Nov 2023 18:26:16 +0100 Message-Id: <20231110172620.396838-2-alassane.yattara@savoirfairelinux.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231110172620.396838-1-alassane.yattara@savoirfairelinux.com> References: <20231110172620.396838-1-alassane.yattara@savoirfairelinux.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Fri, 10 Nov 2023 17:26:37 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/15507 Check search box for a build by recipe name Test the search box in the builds table on the all builds page Signed-off-by: Alassane Yattara --- .../tests/browser/test_all_builds_page.py | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/lib/toaster/tests/browser/test_all_builds_page.py b/lib/toaster/tests/browser/test_all_builds_page.py index d4312bb3..eb14f89d 100644 --- a/lib/toaster/tests/browser/test_all_builds_page.py +++ b/lib/toaster/tests/browser/test_all_builds_page.py @@ -11,6 +11,7 @@ import re, time from django.urls import reverse from django.utils import timezone +from selenium.webdriver.remote.webdriver import WebElement from tests.browser.selenium_helpers import SeleniumTestCase from orm.models import BitbakeVersion, Release, Project, Build, Target @@ -102,6 +103,18 @@ class TestAllBuildsPage(SeleniumTestCase): return found_row + def _get_create_builds(self, **kwargs): + """ Create a build and return the build object """ + build1 = Build.objects.create(**self.project1_build_success) + build2 = Build.objects.create(**self.project1_build_failure) + + # add some targets to these builds so they have recipe links + # (and so we can find the row in the ToasterTable corresponding to + # a particular build) + Target.objects.create(build=build1, target='foo') + Target.objects.create(build=build2, target='bar') + return build1, build2 + def test_show_tasks_with_suffix(self): """ Task should be shown as suffix on build name """ build = Build.objects.create(**self.project1_build_success) @@ -146,7 +159,6 @@ class TestAllBuildsPage(SeleniumTestCase): self.assertEqual(len(run_again_button), 0, 'should not see a rebuild button for cli builds') - def test_tooltips_on_project_name(self): """ Test tooltips shown next to project name in the main table @@ -188,14 +200,7 @@ class TestAllBuildsPage(SeleniumTestCase): recent builds area; failed builds should not have links on the time column, or in the recent builds area """ - build1 = Build.objects.create(**self.project1_build_success) - build2 = Build.objects.create(**self.project1_build_failure) - - # add some targets to these builds so they have recipe links - # (and so we can find the row in the ToasterTable corresponding to - # a particular build) - Target.objects.create(build=build1, target='foo') - Target.objects.create(build=build2, target='bar') + build1, build2 = self._get_create_builds() url = reverse('all-builds') self.get(url) @@ -223,3 +228,23 @@ class TestAllBuildsPage(SeleniumTestCase): links = build2_row.find_elements(By.CSS_SELECTOR, 'td.time a') msg = 'should not be a link on the build time for a failed build' self.assertEquals(len(links), 0, msg) + + def test_builds_table_search_box(self): + """ Test the search box in the builds table on the all builds page """ + self._get_create_builds() + + url = reverse('all-builds') + self.get(url) + + # Check search box is present and works + self.wait_until_present('#allbuildstable tbody tr') + search_box = self.find('#search-input-allbuildstable') + self.assertTrue(search_box.is_displayed()) + + # Check that we can search for a build by recipe name + search_box.send_keys('foo') + search_btn = self.find('#search-submit-allbuildstable') + search_btn.click() + self.wait_until_present('#allbuildstable tbody tr') + rows = self.find_all('#allbuildstable tbody tr') + self.assertTrue(len(rows) >= 1) From patchwork Fri Nov 10 17:26:17 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alassane Yattara X-Patchwork-Id: 34282 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 53638C4167D for ; Fri, 10 Nov 2023 17:26:37 +0000 (UTC) Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by mx.groups.io with SMTP id smtpd.web11.33672.1699637189492096419 for ; Fri, 10 Nov 2023 09:26:29 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@savoirfairelinux.com header.s=DFC430D2-D198-11EC-948E-34200CB392D2 header.b=HFf07Meo; spf=pass (domain: savoirfairelinux.com, ip: 208.88.110.44, mailfrom: alassane.yattara@savoirfairelinux.com) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id D032C9C34CE for ; Fri, 10 Nov 2023 12:26:28 -0500 (EST) Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10032) with ESMTP id 5NHgrM_K2hNK; Fri, 10 Nov 2023 12:26:28 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 591679C34CA; Fri, 10 Nov 2023 12:26:28 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.savoirfairelinux.com 591679C34CA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=savoirfairelinux.com; s=DFC430D2-D198-11EC-948E-34200CB392D2; t=1699637188; bh=dMSUvnJ4UdwccVBzbieZFfOxYEHmH/jbYoRYcw4DpHc=; h=From:To:Date:Message-Id:MIME-Version; b=HFf07MeoV+vXee5A6K9KMEPKz6e6NfXtQ+EGmZomjb89X6+wyPAyZsuSBPs2wGd6D o2Uhf9fnfAc/DQDErG4HQ52QgVOahpt75x/0WGuXk0SzGPZ9/SrHbthO8OLm3XeWW8 72RcenLniKudELSv1d0XwalFkIpRwOlLfWTFTBrpBM62sOYDYykcGlem8ML1AHKvox qQnDKF8j/uSJBAl19rxoFIMwuwq43NUY41mzaUpEAFwslgizygY9Ccxna3Ja4m61nJ YqY1ifT4UBWGuRz/2XjZfCETZiDoLEUPhefiESgtx+emrq4BuMrKI/jC5PxT3bjeMZ I9RoB0HzH+vRA== X-Virus-Scanned: amavis at mail.savoirfairelinux.com Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10026) with ESMTP id rHSK-S2KSyZW; Fri, 10 Nov 2023 12:26:28 -0500 (EST) Received: from jedi.. (unknown [196.127.183.75]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id 7954C9C328E; Fri, 10 Nov 2023 12:26:27 -0500 (EST) From: Alassane Yattara To: bitbake-devel@lists.openembedded.org Cc: Alassane Yattara Subject: [PATCH 3/6] Toaster: Write UI TestCase -> Visualize all builds Date: Fri, 10 Nov 2023 18:26:17 +0100 Message-Id: <20231110172620.396838-3-alassane.yattara@savoirfairelinux.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231110172620.396838-1-alassane.yattara@savoirfairelinux.com> References: <20231110172620.396838-1-alassane.yattara@savoirfairelinux.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Fri, 10 Nov 2023 17:26:37 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/15508 Test the filtering on failure tasks column in the builds table on the all builds page Signed-off-by: Alassane Yattara --- .../tests/browser/test_all_builds_page.py | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/lib/toaster/tests/browser/test_all_builds_page.py b/lib/toaster/tests/browser/test_all_builds_page.py index eb14f89d..81498aa8 100644 --- a/lib/toaster/tests/browser/test_all_builds_page.py +++ b/lib/toaster/tests/browser/test_all_builds_page.py @@ -113,6 +113,20 @@ class TestAllBuildsPage(SeleniumTestCase): # a particular build) Target.objects.create(build=build1, target='foo') Target.objects.create(build=build2, target='bar') + + if kwargs: + # Create kwargs.get('success') builds with success status with target + # and kwargs.get('failure') builds with failure status with target + for i in range(kwargs.get('success', 0)): + build = Build.objects.create(**self.project1_build_success) + Target.objects.create(build=build, + target=f'{i}_success_recipe', + task=f'{i}_success_task') + for i in range(kwargs.get('failure', 0)): + build = Build.objects.create(**self.project1_build_failure) + Target.objects.create(build=build, + target=f'{i}_fail_recipe', + task=f'{i}_fail_task') return build1, build2 def test_show_tasks_with_suffix(self): @@ -248,3 +262,27 @@ class TestAllBuildsPage(SeleniumTestCase): self.wait_until_present('#allbuildstable tbody tr') rows = self.find_all('#allbuildstable tbody tr') self.assertTrue(len(rows) >= 1) + + def test_filtering_on_failure_tasks_column(self): + """ Test the filtering on failure tasks column in the builds table on the all builds page """ + self._get_create_builds(success=10, failure=10) + + url = reverse('all-builds') + self.get(url) + + # Check filtering on failure tasks column + self.wait_until_present('#allbuildstable tbody tr') + failed_tasks_filter = self.find('#failed_tasks_filter') + failed_tasks_filter.click() + # Check popup is visible + time.sleep(1) + self.wait_until_present('#filter-modal-allbuildstable') + self.assertTrue(self.find('#filter-modal-allbuildstable').is_displayed()) + # Check that we can filter by failure tasks + build_without_failure_tasks = self.find('#failed_tasks_filter\\:without_failed_tasks') + build_without_failure_tasks.click() + # click on apply button + self.find('#filter-modal-allbuildstable .btn-primary').click() + self.wait_until_present('#allbuildstable tbody tr') + # Check if filter is applied, by checking if failed_tasks_filter has btn-primary class + self.assertTrue(self.find('#failed_tasks_filter').get_attribute('class').find('btn-primary') != -1) From patchwork Fri Nov 10 17:26:18 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alassane Yattara X-Patchwork-Id: 34281 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5A6BFC41535 for ; Fri, 10 Nov 2023 17:26:37 +0000 (UTC) Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by mx.groups.io with SMTP id smtpd.web11.33674.1699637190952090637 for ; Fri, 10 Nov 2023 09:26:31 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@savoirfairelinux.com header.s=DFC430D2-D198-11EC-948E-34200CB392D2 header.b=AniS/OlV; spf=pass (domain: savoirfairelinux.com, ip: 208.88.110.44, mailfrom: alassane.yattara@savoirfairelinux.com) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 4D70C9C34F4 for ; Fri, 10 Nov 2023 12:26:30 -0500 (EST) Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10032) with ESMTP id KHR52LiwIz6H; Fri, 10 Nov 2023 12:26:29 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 682A89C34CC; Fri, 10 Nov 2023 12:26:29 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.savoirfairelinux.com 682A89C34CC DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=savoirfairelinux.com; s=DFC430D2-D198-11EC-948E-34200CB392D2; t=1699637189; bh=Z4uYXMJhe7y0p2zC/cWsd+g2rYMbavpSCcRIKlcO6fE=; h=From:To:Date:Message-Id:MIME-Version; b=AniS/OlV9lc0uLcPqKNyTBIp1EYNDKYL7T+L8MnkaBAhEJpcNSkkFpcdI2wlYkAyw 31j7g9gcYCw7f9F3UNrAnvuhaeffNCsCiCfefvMKpKaCSjxSz0KREkCtROtrkMtvrB MARtTqzqFC7zKB1DV4GmaZsV2r7mumCAY4V7mrYF6L6+yLS8hTMhF+iELYeRKv61rB wAPzxA+U2bYihw1R2UTdS1Peu9d5GG+04FuwXZhP5a1bfg5c7XjuVoZddVDVl4sOfW pLIOlFqWstelbsClpPI4/XYTP27sSvhzwAzkDpa5Jbolzm6VHxDT2RS7zLwfKK4UgT OnVkNF/RPhO4Q== X-Virus-Scanned: amavis at mail.savoirfairelinux.com Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10026) with ESMTP id mqYV2KEITDYD; Fri, 10 Nov 2023 12:26:29 -0500 (EST) Received: from jedi.. (unknown [196.127.183.75]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id 9F2279C328E; Fri, 10 Nov 2023 12:26:28 -0500 (EST) From: Alassane Yattara To: bitbake-devel@lists.openembedded.org Cc: Alassane Yattara Subject: [PATCH 4/6] Toaster: Write UI TestCase -> Visualize all builds Date: Fri, 10 Nov 2023 18:26:18 +0100 Message-Id: <20231110172620.396838-4-alassane.yattara@savoirfairelinux.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231110172620.396838-1-alassane.yattara@savoirfairelinux.com> References: <20231110172620.396838-1-alassane.yattara@savoirfairelinux.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Fri, 10 Nov 2023 17:26:37 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/15509 Test the filtering on completed_on column in the builds table on the all builds page Signed-off-by: Alassane Yattara --- .../tests/browser/test_all_builds_page.py | 80 ++++++++++++++++++- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/lib/toaster/tests/browser/test_all_builds_page.py b/lib/toaster/tests/browser/test_all_builds_page.py index 81498aa8..90dcdd91 100644 --- a/lib/toaster/tests/browser/test_all_builds_page.py +++ b/lib/toaster/tests/browser/test_all_builds_page.py @@ -11,10 +11,10 @@ import re, time from django.urls import reverse from django.utils import timezone -from selenium.webdriver.remote.webdriver import WebElement +from bldcontrol.models import BuildRequest from tests.browser.selenium_helpers import SeleniumTestCase -from orm.models import BitbakeVersion, Release, Project, Build, Target +from orm.models import BitbakeVersion, Layer, Layer_Version, Recipe, Release, Project, Build, Target, Task from selenium.webdriver.common.by import By @@ -118,17 +118,51 @@ class TestAllBuildsPage(SeleniumTestCase): # Create kwargs.get('success') builds with success status with target # and kwargs.get('failure') builds with failure status with target for i in range(kwargs.get('success', 0)): + now = timezone.now() + self.project1_build_success['started_on'] = now + self.project1_build_success[ + 'completed_on'] = now - timezone.timedelta(days=i) build = Build.objects.create(**self.project1_build_success) Target.objects.create(build=build, target=f'{i}_success_recipe', task=f'{i}_success_task') + + self._set_buildRequest_and_task_on_build(build) for i in range(kwargs.get('failure', 0)): + now = timezone.now() + self.project1_build_failure['started_on'] = now + self.project1_build_failure[ + 'completed_on'] = now - timezone.timedelta(days=i) build = Build.objects.create(**self.project1_build_failure) Target.objects.create(build=build, target=f'{i}_fail_recipe', task=f'{i}_fail_task') + self._set_buildRequest_and_task_on_build(build) return build1, build2 + def _create_recipe(self): + """ Add a recipe to the database and return it """ + layer = Layer.objects.create() + layer_version = Layer_Version.objects.create(layer=layer) + return Recipe.objects.create(name='recipe_foo', layer_version=layer_version) + + def _set_buildRequest_and_task_on_build(self, build): + """ Set buildRequest and task on build """ + build.recipes_parsed = 1 + build.save() + buildRequest = BuildRequest.objects.create( + build=build, + project=self.project1, + state=BuildRequest.REQ_COMPLETED) + build.build_request = buildRequest + recipe = self._create_recipe() + task = Task.objects.create(build=build, + recipe=recipe, + task_name='task', + outcome=Task.OUTCOME_SUCCESS) + task.save() + build.save() + def test_show_tasks_with_suffix(self): """ Task should be shown as suffix on build name """ build = Build.objects.create(**self.project1_build_success) @@ -286,3 +320,45 @@ class TestAllBuildsPage(SeleniumTestCase): self.wait_until_present('#allbuildstable tbody tr') # Check if filter is applied, by checking if failed_tasks_filter has btn-primary class self.assertTrue(self.find('#failed_tasks_filter').get_attribute('class').find('btn-primary') != -1) + + def test_filtering_on_completedOn_column(self): + """ Test the filtering on completed_on column in the builds table on the all builds page """ + self._get_create_builds(success=10, failure=10) + + url = reverse('all-builds') + self.get(url) + + # Check filtering on failure tasks column + self.wait_until_present('#allbuildstable tbody tr') + completed_on_filter = self.find('#completed_on_filter') + completed_on_filter.click() + # Check popup is visible + time.sleep(1) + self.wait_until_present('#filter-modal-allbuildstable') + self.assertTrue(self.find('#filter-modal-allbuildstable').is_displayed()) + # Check that we can filter by failure tasks + build_without_failure_tasks = self.find('#completed_on_filter\\:date_range') + build_without_failure_tasks.click() + # click on apply button + self.find('#filter-modal-allbuildstable .btn-primary').click() + self.wait_until_present('#allbuildstable tbody tr') + # Check if filter is applied, by checking if completed_on_filter has btn-primary class + self.assertTrue(self.find('#completed_on_filter').get_attribute('class').find('btn-primary') != -1) + + # Filter by date range + self.find('#completed_on_filter').click() + self.wait_until_present('#filter-modal-allbuildstable') + date_ranges = self.driver.find_elements( + By.XPATH, '//input[@class="form-control hasDatepicker"]') + today = timezone.now() + yestersday = today - timezone.timedelta(days=1) + time.sleep(1) + date_ranges[0].send_keys(yestersday.strftime('%Y-%m-%d')) + date_ranges[1].send_keys(today.strftime('%Y-%m-%d')) + self.find('#filter-modal-allbuildstable .btn-primary').click() + self.wait_until_present('#allbuildstable tbody tr') + self.assertTrue(self.find('#completed_on_filter').get_attribute('class').find('btn-primary') != -1) + # Check if filter is applied, number of builds displayed should be 6 + time.sleep(1) + self.assertTrue(len(self.find_all('#allbuildstable tbody tr')) == 6) + From patchwork Fri Nov 10 17:26:19 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alassane Yattara X-Patchwork-Id: 34283 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 63D49C4167B for ; Fri, 10 Nov 2023 17:26:37 +0000 (UTC) Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by mx.groups.io with SMTP id smtpd.web10.33404.1699637193008219953 for ; Fri, 10 Nov 2023 09:26:33 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@savoirfairelinux.com header.s=DFC430D2-D198-11EC-948E-34200CB392D2 header.b=HeymXhCK; spf=pass (domain: savoirfairelinux.com, ip: 208.88.110.44, mailfrom: alassane.yattara@savoirfairelinux.com) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id E4F009C34E1 for ; Fri, 10 Nov 2023 12:26:30 -0500 (EST) Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10032) with ESMTP id sCeTMV66xJFF; Fri, 10 Nov 2023 12:26:30 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 64B429C328E; Fri, 10 Nov 2023 12:26:30 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.savoirfairelinux.com 64B429C328E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=savoirfairelinux.com; s=DFC430D2-D198-11EC-948E-34200CB392D2; t=1699637190; bh=D6hVVQ74vLWWYu83dRv5PN2yvxmOqshCGPltwrl7t/Y=; h=From:To:Date:Message-Id:MIME-Version; b=HeymXhCKIgREXDnUTJJkWrfWKNXVMu/GcQ/M0yk/wdcr6BVJlFCuTi4vuU6Di7X57 GVLDN1R1w5BVvYTW5kK4keBVw4WO5GNA7NVux35Q9muB+OVWJST+7v3EMnDXjpMfyg xkpJFsZgFnzEU6ggNKz0awmVnqOnXT9mazO6xYXAUMX24MtcnRCz9MrXrS+P8vrDxB v9oSeAiKBuHtsJBFUkfTxz51/zb+34B+rRC32D5Yd3oIDmwmI3TZsfbGJu002ulxwv lC4xGbO1h5x60lZC0jTcwhEaIVaymmw0phmh4HM5cpjDFqpNgQO9bYzBQdtShhC8tu XbIFhFe/Chd+w== X-Virus-Scanned: amavis at mail.savoirfairelinux.com Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10026) with ESMTP id c6R6Ozh3qOLl; Fri, 10 Nov 2023 12:26:30 -0500 (EST) Received: from jedi.. (unknown [196.127.183.75]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id B6B899C34CE; Fri, 10 Nov 2023 12:26:29 -0500 (EST) From: Alassane Yattara To: bitbake-devel@lists.openembedded.org Cc: Alassane Yattara Subject: [PATCH 5/6] Toaster: Toaster: Write UI TestCase -> Visualize all builds Date: Fri, 10 Nov 2023 18:26:19 +0100 Message-Id: <20231110172620.396838-5-alassane.yattara@savoirfairelinux.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231110172620.396838-1-alassane.yattara@savoirfairelinux.com> References: <20231110172620.396838-1-alassane.yattara@savoirfairelinux.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Fri, 10 Nov 2023 17:26:37 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/15510 Test the edit column feature in the builds table on the all builds page Signed-off-by: Alassane Yattara --- .../tests/browser/test_all_builds_page.py | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/lib/toaster/tests/browser/test_all_builds_page.py b/lib/toaster/tests/browser/test_all_builds_page.py index 90dcdd91..bd2b4799 100644 --- a/lib/toaster/tests/browser/test_all_builds_page.py +++ b/lib/toaster/tests/browser/test_all_builds_page.py @@ -362,3 +362,62 @@ class TestAllBuildsPage(SeleniumTestCase): time.sleep(1) self.assertTrue(len(self.find_all('#allbuildstable tbody tr')) == 6) + def test_builds_table_editColumn(self): + """ Test the edit column feature in the builds table on the all builds page """ + self._get_create_builds(success=10, failure=10) + + def test_edit_column(check_box_id): + # Check that we can hide/show table column + check_box = self.find(f'#{check_box_id}') + th_class = str(check_box_id).replace('checkbox-', '') + if check_box.is_selected(): + # check if column is visible in table + self.assertTrue( + self.find( + f'#allbuildstable thead th.{th_class}' + ).is_displayed(), + f"The {th_class} column is checked in EditColumn dropdown, but it's not visible in table" + ) + check_box.click() + # check if column is hidden in table + self.assertFalse( + self.find( + f'#allbuildstable thead th.{th_class}' + ).is_displayed(), + f"The {th_class} column is unchecked in EditColumn dropdown, but it's visible in table" + ) + else: + # check if column is hidden in table + self.assertFalse( + self.find( + f'#allbuildstable thead th.{th_class}' + ).is_displayed(), + f"The {th_class} column is unchecked in EditColumn dropdown, but it's visible in table" + ) + check_box.click() + # check if column is visible in table + self.assertTrue( + self.find( + f'#allbuildstable thead th.{th_class}' + ).is_displayed(), + f"The {th_class} column is checked in EditColumn dropdown, but it's not visible in table" + ) + url = reverse('all-builds') + self.get(url) + self.wait_until_present('#allbuildstable tbody tr') + + # Check edit column + edit_column = self.find('#edit-columns-button') + self.assertTrue(edit_column.is_displayed()) + edit_column.click() + # Check dropdown is visible + self.wait_until_visible('ul.dropdown-menu.editcol') + + # Check that we can hide the edit column + test_edit_column('checkbox-errors_no') + test_edit_column('checkbox-failed_tasks') + test_edit_column('checkbox-image_files') + test_edit_column('checkbox-project') + test_edit_column('checkbox-started_on') + test_edit_column('checkbox-time') + test_edit_column('checkbox-warnings_no') From patchwork Fri Nov 10 17:26:20 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alassane Yattara X-Patchwork-Id: 34284 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 70EF0C04A95 for ; Fri, 10 Nov 2023 17:26:37 +0000 (UTC) Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by mx.groups.io with SMTP id smtpd.web10.33405.1699637193139221772 for ; Fri, 10 Nov 2023 09:26:33 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@savoirfairelinux.com header.s=DFC430D2-D198-11EC-948E-34200CB392D2 header.b=kX+Jkq6A; spf=pass (domain: savoirfairelinux.com, ip: 208.88.110.44, mailfrom: alassane.yattara@savoirfairelinux.com) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 7A5319C328E for ; Fri, 10 Nov 2023 12:26:32 -0500 (EST) Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10032) with ESMTP id 5QUnZO6mqRfj; Fri, 10 Nov 2023 12:26:31 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 9B5339C34EB; Fri, 10 Nov 2023 12:26:31 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.savoirfairelinux.com 9B5339C34EB DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=savoirfairelinux.com; s=DFC430D2-D198-11EC-948E-34200CB392D2; t=1699637191; bh=k8xUK/W/cCZzp+uGrQYcUx1+24rxNatPO2UsIeBji2o=; h=From:To:Date:Message-Id:MIME-Version; b=kX+Jkq6An166PeccjDI/xvq/+jiDe40QbLTPrYwhMEQbPzclj46onSQ+qgKHaY2IE 8+mhKDYyjW4f4itkMUNFMzbWBfA1GqjY2YJDx19p2W3TMnjxcPtm00rshX+W6CY9Cz D4eB23/eRQ+a6hPBt+rhz0R/qrmB739Vym6JX2l2Ao+ZyjAdYAaGL2q6V+wN+9XJ8k IipFBAYnXjY3wHFd7gmZ5+EauALXuj/Rb5/i6/LnBZfECwNY7XFW8RFd/48rEeBA+P WkQemTwkO0LcMxhFQwJu0PMfZiKBKORsakVgVTmVakHRtV0OiS+P1wIXV/Hs2CS6wx MbNCFN6lh+poQ== X-Virus-Scanned: amavis at mail.savoirfairelinux.com Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10026) with ESMTP id S0bPso70Miss; Fri, 10 Nov 2023 12:26:31 -0500 (EST) Received: from jedi.. (unknown [196.127.183.75]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id BCFB89C34CA; Fri, 10 Nov 2023 12:26:30 -0500 (EST) From: Alassane Yattara To: bitbake-devel@lists.openembedded.org Cc: Alassane Yattara Subject: [PATCH 6/6] Toaster: Toaster: Write UI TestCase -> Visualize all builds Date: Fri, 10 Nov 2023 18:26:20 +0100 Message-Id: <20231110172620.396838-6-alassane.yattara@savoirfairelinux.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231110172620.396838-1-alassane.yattara@savoirfairelinux.com> References: <20231110172620.396838-1-alassane.yattara@savoirfairelinux.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Fri, 10 Nov 2023 17:26:37 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/15511 Test the "show rows" feature in the builds table, on the all builds page Signed-off-by: Alassane Yattara --- .../tests/browser/test_all_builds_page.py | 64 +++++++++++++++---- 1 file changed, 52 insertions(+), 12 deletions(-) diff --git a/lib/toaster/tests/browser/test_all_builds_page.py b/lib/toaster/tests/browser/test_all_builds_page.py index bd2b4799..4e9b9fd7 100644 --- a/lib/toaster/tests/browser/test_all_builds_page.py +++ b/lib/toaster/tests/browser/test_all_builds_page.py @@ -7,9 +7,11 @@ # SPDX-License-Identifier: GPL-2.0-only # -import re, time +import re +import time from django.urls import reverse +from selenium.webdriver.support.select import Select from django.utils import timezone from bldcontrol.models import BuildRequest from tests.browser.selenium_helpers import SeleniumTestCase @@ -151,13 +153,13 @@ class TestAllBuildsPage(SeleniumTestCase): build.recipes_parsed = 1 build.save() buildRequest = BuildRequest.objects.create( - build=build, + build=build, project=self.project1, state=BuildRequest.REQ_COMPLETED) build.build_request = buildRequest recipe = self._create_recipe() task = Task.objects.create(build=build, - recipe=recipe, + recipe=recipe, task_name='task', outcome=Task.OUTCOME_SUCCESS) task.save() @@ -189,7 +191,8 @@ class TestAllBuildsPage(SeleniumTestCase): but should be shown for other builds """ build1 = Build.objects.create(**self.project1_build_success) - default_build = Build.objects.create(**self.default_project_build_success) + default_build = Build.objects.create( + **self.default_project_build_success) url = reverse('all-builds') self.get(url) @@ -311,15 +314,18 @@ class TestAllBuildsPage(SeleniumTestCase): # Check popup is visible time.sleep(1) self.wait_until_present('#filter-modal-allbuildstable') - self.assertTrue(self.find('#filter-modal-allbuildstable').is_displayed()) + self.assertTrue( + self.find('#filter-modal-allbuildstable').is_displayed()) # Check that we can filter by failure tasks - build_without_failure_tasks = self.find('#failed_tasks_filter\\:without_failed_tasks') + build_without_failure_tasks = self.find( + '#failed_tasks_filter\\:without_failed_tasks') build_without_failure_tasks.click() # click on apply button self.find('#filter-modal-allbuildstable .btn-primary').click() self.wait_until_present('#allbuildstable tbody tr') # Check if filter is applied, by checking if failed_tasks_filter has btn-primary class - self.assertTrue(self.find('#failed_tasks_filter').get_attribute('class').find('btn-primary') != -1) + self.assertTrue(self.find('#failed_tasks_filter').get_attribute( + 'class').find('btn-primary') != -1) def test_filtering_on_completedOn_column(self): """ Test the filtering on completed_on column in the builds table on the all builds page """ @@ -335,16 +341,19 @@ class TestAllBuildsPage(SeleniumTestCase): # Check popup is visible time.sleep(1) self.wait_until_present('#filter-modal-allbuildstable') - self.assertTrue(self.find('#filter-modal-allbuildstable').is_displayed()) + self.assertTrue( + self.find('#filter-modal-allbuildstable').is_displayed()) # Check that we can filter by failure tasks - build_without_failure_tasks = self.find('#completed_on_filter\\:date_range') + build_without_failure_tasks = self.find( + '#completed_on_filter\\:date_range') build_without_failure_tasks.click() # click on apply button self.find('#filter-modal-allbuildstable .btn-primary').click() self.wait_until_present('#allbuildstable tbody tr') # Check if filter is applied, by checking if completed_on_filter has btn-primary class - self.assertTrue(self.find('#completed_on_filter').get_attribute('class').find('btn-primary') != -1) - + self.assertTrue(self.find('#completed_on_filter').get_attribute( + 'class').find('btn-primary') != -1) + # Filter by date range self.find('#completed_on_filter').click() self.wait_until_present('#filter-modal-allbuildstable') @@ -357,7 +366,8 @@ class TestAllBuildsPage(SeleniumTestCase): date_ranges[1].send_keys(today.strftime('%Y-%m-%d')) self.find('#filter-modal-allbuildstable .btn-primary').click() self.wait_until_present('#allbuildstable tbody tr') - self.assertTrue(self.find('#completed_on_filter').get_attribute('class').find('btn-primary') != -1) + self.assertTrue(self.find('#completed_on_filter').get_attribute( + 'class').find('btn-primary') != -1) # Check if filter is applied, number of builds displayed should be 6 time.sleep(1) self.assertTrue(len(self.find_all('#allbuildstable tbody tr')) == 6) @@ -421,3 +431,33 @@ class TestAllBuildsPage(SeleniumTestCase): test_edit_column('checkbox-started_on') test_edit_column('checkbox-time') test_edit_column('checkbox-warnings_no') + + def test_builds_table_show_rows(self): + """ Test the show rows feature in the builds table on the all builds page """ + self._get_create_builds(success=100, failure=100) + + def test_show_rows(row_to_show, show_row_link): + # Check that we can show rows == row_to_show + show_row_link.select_by_value(str(row_to_show)) + self.wait_until_present('#allbuildstable tbody tr') + time.sleep(1) + self.assertTrue( + len(self.find_all('#allbuildstable tbody tr')) == row_to_show + ) + + url = reverse('all-builds') + self.get(url) + self.wait_until_present('#allbuildstable tbody tr') + + show_rows = self.driver.find_elements( + By.XPATH, + '//select[@class="form-control pagesize-allbuildstable"]' + ) + # Check show rows + for show_row_link in show_rows: + show_row_link = Select(show_row_link) + test_show_rows(10, show_row_link) + test_show_rows(25, show_row_link) + test_show_rows(50, show_row_link) + test_show_rows(100, show_row_link) + test_show_rows(150, show_row_link)