openwisp-utils icon indicating copy to clipboard operation
openwisp-utils copied to clipboard

[bug] Flaky test: test_autocomplete_shelf_filter

Open nemesifier opened this issue 1 year ago • 0 comments

Describe the bug The following test: test_project.tests.test_selenium.TestAutocompleteFilter.test_autocomplete_shelf_filter it's failing 10% of times on CI.

Output:

======================================================================
FAIL: test_autocomplete_shelf_filter (test_project.tests.test_selenium.TestAutocompleteFilter)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/unittest/case.py", line 59, in testPartExecutor
    yield
  File "/opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/unittest/case.py", line 591, in run
    self._callTestMethod(testMethod)
  File "/opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/unittest/case.py", line 549, in _callTestMethod
    method()
  File "/home/runner/work/openwisp-utils/openwisp-utils/tests/test_project/tests/test_selenium.py", line 727, in test_autocomplete_shelf_filter
    self.assertIn(horror_shelf.name, self.web_driver.page_source)
  File "/opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/unittest/case.py", line 1112, in assertIn
    self.fail(self._formatMessage(msg, standardMsg))
  File "/opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/unittest/case.py", line 675, in fail
    raise self.failureException(msg)
AssertionError: 'Horror' not found in '<html lang="en-us" dir="ltr"><head>\n<title>Select book to change | OpenWISP Admin</title>\n<link rel="stylesheet" type="text/css" href="/static/admin/css/base.css">\n\n\n  \n  \n\n\n  \n    <link rel="stylesheet" type="text/css" href="/static/admin/css/openwisp.css" media="all">\n  \n    <link rel="stylesheet" type="text/css" href="/static/menu-test.css" media="all">\n  \n    <link rel="icon" type="image/x-icon" href="/static/ui/openwisp/images/favicon.png">\n  \n\n\n  \n   <style>\n    *, *:before, *:after {\n      transition:none!important;\n    }\n   </style>\n  \n\n  <link rel="stylesheet" type="text/css" href="/static/admin/css/changelists.css">\n  \n  <link rel="stylesheet" type="text/css" href="/static/admin/css/ow-filters.css">\n  \n    <script src="/admin/jsi18n/"></script>\n  \n  \n    <script src="/static/admin/js/ow-filter.js"></script>\n  \n  <link href="/static/admin/css/vendor/select2/select2.min.css" media="screen" rel="stylesheet">\n<link href="/static/django-admin-autocomplete-filter/css/autocomplete-fix.css" media="screen" rel="stylesheet">\n<link href="/static/admin/css/ow-auto-filter.css" media="screen" rel="stylesheet">\n<link href="/static/admin/css/autocomplete.css" media="screen" rel="stylesheet">\n  \n\n\n\n\n<script src="/static/admin/js/vendor/jquery/jquery.min.js"></script>\n<script src="/static/admin/js/vendor/select2/select2.full.min.js"></script>\n<script src="/static/admin/js/vendor/select2/i18n/en.js"></script>\n<script src="/static/admin/js/jquery.init.js"></script>\n<script src="/static/admin/js/core.js"></script>\n<script src="/static/admin/js/autocomplete.js"></script>\n<script src="/static/admin/js/admin/RelatedObjectLookups.js"></script>\n<script src="/static/django-admin-autocomplete-filter/js/autocomplete_filter_qs.js"></script>\n<script src="/static/admin/js/actions.js"></script>\n<script src="/static/admin/js/ow-auto-filter.js"></script>\n<script src="/static/admin/js/urlify.js"></script>\n<script src="/static/admin/js/prepopulate.js"></script>\n<script src="/static/admin/js/vendor/xregexp/xregexp.min.js"></script>\n\n\n    <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0">\n    <link rel="stylesheet" type="text/css" href="/static/admin/css/responsive.css">\n    \n\n<meta name="robots" content="NONE,NOARCHIVE">\n</head>\n\n<body class=" app-test_project model-book change-list" data-admin-utc-offset="0">\n\n<!-- Container -->\n<div id="container" class="">\n  \n    <div class="menu-backdrop"></div>\n    <div id="menu">\n      <div class="menu-bar">\n        \n  <div class="head">\n    <span tabindex="0" role="button" aria-label="Minimize menu" class="hamburger">\n    <span></span></span>\n    <h1 id="site-name"><a href="/admin/">OpenWISP</a></h1>\n  </div>\n\n      </div>\n      \n      \n<button class="menu-toggle" title="Minimize menu">\n  <span></span>\n</button>\n<nav class="nav">\n   \n  <a class="menu-item" href="/admin" aria-label="Home">\n    <span class="ow-dashboard-icon icon"></span>\n    <span class="label">Home</span>\n  </a>\n    \n  <a class="menu-item" href="/admin/test_project/shelf/" aria-label="Shelfs">\n    <span class="shelf icon"></span>\n    <span class="label">Shelfs</span>\n  </a>\n    \n  <div class="menu-group">\n    <div id="mg-control-[32](https://github.com/openwisp/openwisp-utils/actions/runs/10221026912/job/28282626459#step:6:33)" aria-label="Authentication And Authorization" tabindex="0" role="button" aria-expanded="false" aria-controls="mg-dropdown-32" class="mg-head">\n      <div class="mg-heading">\n        <span class="auth icon"></span>\n        <span class="label">Authentication And Authorization</span>\n      </div>\n      <span class="mg-arrow"></span>\n    </div>\n    <div id="mg-dropdown-32" role="region" aria-labelledby="mg-control-32" class="mg-dropdown">\n      <div class="mg-dropdown-label">Authentication And Authorization</div>\n      <ul class="mg-list">\n        \n        <li>\n          <a class="mg-link" href="/admin/auth/user/" aria-label="Users" tabindex="-1">\n            <span class="user icon"></span>\n            <span class="label">Users</span>\n          </a>\n        </li>\n        \n        <li>\n          <a class="mg-link" href="/admin/auth/user/add/" aria-label="Add user" tabindex="-1">\n            <span class="add-user icon"></span>\n            <span class="label">Add user</span>\n          </a>\n        </li>\n        \n      </ul>\n    </div>\n  </div>\n    \n  <div class="menu-group">\n    <div id="mg-control-[33](https://github.com/openwisp/openwisp-utils/actions/runs/10221026912/job/28282626459#step:6:34)" aria-label="Docs" tabindex="0" role="button" aria-expanded="false" aria-controls="mg-dropdown-33" class="mg-head">\n      <div class="mg-heading">\n        <span class="docs icon"></span>\n        <span class="label">Docs</span>\n      </div>\n      <span class="mg-arrow"></span>\n    </div>\n    <div id="mg-dropdown-33" role="region" aria-labelledby="mg-control-33" class="mg-dropdown">\n      <div class="mg-dropdown-label">Docs</div>\n      <ul class="mg-list">\n        \n        <li>\n          <a class="mg-link" href="https://openwisp.org/" aria-label="OpenWISP" tabindex="-1">\n            <span class="link icon"></span>\n            <span class="label">OpenWISP</span>\n          </a>\n        </li>\n        \n        <li>\n          <a class="mg-link" href="https://openwisp.org/thecode.html" aria-label="Code" tabindex="-1">\n            <span class="code icon"></span>\n            <span class="label">Code</span>\n          </a>\n        </li>\n        \n      </ul>\n    </div>\n  </div>\n    \n  <a class="menu-item" href="/admin/openwisp-system-info/" aria-label="System info">\n    <span class="ow-info-icon icon"></span>\n    <span class="label">System info</span>\n  </a>\n   \n</nav>\n\n      \n    </div>\n  \n  <div id="main-content" data-select2-id="main-content">\n    \n    <!-- Header -->\n    \n      <div id="header">\n        \n        \n          <div id="ow-user-tools">\n          \n  <div class="account">\n    <div title="account" id="account-btn" role="button" tabindex="0" aria-label="account button" aria-expanded="false" aria-controls="account-dropdown" class="account-button toggle-btn tooltip-sm">\n      <span class="user"></span>\n      <strong>Tester</strong>\n    </div>\n    <ul id="account-dropdown" role="list" aria-labelledby="account-btn" class="account-menu hide">\n      <li class="account-menu-username">\n        <span class="user"></span>\n        <strong>Tester</strong>\n      </li>\n      \n      <li>\n        <a tabindex="-1" href="/admin/password_change/">\n          <span class="password"></span>\n          Change password\n        </a>\n      </li>\n      \n      <li>\n        <a tabindex="-1" class="menu-link" href="/admin/logout/">\n          <span class="logout"></span>\n          Log out\n        </a>\n      </li>\n    </ul>\n  </div>\n\n          </div>\n        \n      </div>\n    \n    <!-- END Header -->\n    \n<div class="breadcrumbs">\n<a href="/admin/">Home</a>\n› <a href="/admin/test_project/">Test_Project</a>\n› Books\n</div>\n\n    \n    <div class="main" id="main" data-select2-id="main">\n      \n      <div class="content" data-select2-id="9">\n        \n          \n        \n        \n  \n    <div id="ow-changelist-filter">\n      <div class="filters-bottom" data-select2-id="8">\n        <span class="left-arrow force-inactive">\n          <img src="/static/ui/openwisp/images/left-arrow.svg" alt="left">\n        </span>\n        <span class="right-arrow force-inactive">\n          <img src="/static/ui/openwisp/images/right-arrow.svg" alt="right">\n        </span>\n        <div aria-label="changelist filters region" tabindex="0" class="ow-filter-slider">\n          <div class="slider" data-select2-id="7">\n            \n<div class="ow-filter auto-filter" data-select2-id="6">\n  \n\n    <h3> By shelf </h3>\n\n    <ul data-select2-id="5">\n        <li data-select2-id="4"><select name="shelf__id" data-dropdown-css-class="ow2-autocomplete-dropdown" data-empty-label="-" id="id-shelf__id-dal-filter" class="admin-autocomplete select2-hidden-accessible" data-ajax--cache="true" data-ajax--delay="250" data-ajax--type="GET" data-ajax--url="/admin/ow-auto-filter/" data-app-label="test_project" data-model-name="book" data-field-name="shelf" data-theme="admin-autocomplete" data-allow-clear="true" data-placeholder="" lang="en" data-select2-id="id-shelf__id-dal-filter" tabindex="-1" aria-hidden="true">\n  <option value="" data-select2-id="2"></option>\n\n</select><span class="select2 select2-container select2-container--admin-autocomplete select2-container--below select2-container--open select2-container--focus" dir="ltr" data-select2-id="1" style="width: 300px;"><span class="selection"><span class="select2-selection select2-selection--single" role="combobox" aria-haspopup="true" aria-expanded="true" tabindex="0" aria-disabled="false" aria-labelledby="select2-id-shelf__id-dal-filter-container" aria-owns="select2-id-shelf__id-dal-filter-results"><span class="select2-selection__rendered" id="select2-id-shelf__id-dal-filter-container" role="textbox" aria-readonly="true"><span class="select2-selection__placeholder">All</span></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span></span></span><span class="dropdown-wrapper" aria-hidden="true"></span></span></li>\n        <li></li>\n    </ul>\n  <div class="auto-filter-choices" style="min-height: 14.75rem;"></div>\n</div>\n\n\n<div class="ow-filter name">\n  \n    \n      <div id="name" aria-label="by name" tabindex="0" aria-controls="choices-" role="button" aria-expanded="false" class="filter-title">\n        <h3>\n           By name \n        </h3>\n        <div class="selected-option" tabindex="0" title="All">\n          All\n        </div>\n      </div>\n    \n  \n    \n  \n    \n  \n  <div id="choices-name" role="region" aria-labelledby="name" class="filter-options">\n    <ul>\n    \n      <li>\n        <a class="selected" title="All" href="?">\n          All\n        </a>\n      </li>\n    \n      <li>\n        <a title="Book 1" href="?name=Book+1">\n          Book 1\n        </a>\n      </li>\n    \n      <li>\n        <a title="Book 2" href="?name=Book+2">\n          Book 2\n        </a>\n      </li>\n    \n    </ul>\n  </div>\n</div>\n\n          </div>\n        </div>\n      </div>\n      <div class="filters-top">\n        <h2>Filter</h2>\n        <div class="filters-control">\n          \n          \n        </div>\n      </div>\n    </div>\n  \n\n        <!-- Content -->\n        <div id="content" class="">\n          <div class="title-wrapper">\n            \n            <h1>Select book to change</h1>\n            \n            \n        <ul class="object-tools">\n          \n            \n\n\n  \n  <li>\n    \n    <a href="/admin/test_project/book/add/" class="addlink">\n      Add book\n    </a>\n  </li>\n  \n\n\n          \n        </ul>\n    \n          </div>\n          \n  <div id="content-main">\n    \n        <ul class="object-tools">\n          \n            \n\n\n  \n  <li>\n    \n    <a href="/admin/test_project/book/add/" class="addlink">\n      Add book\n    </a>\n  </li>\n  \n\n\n          \n        </ul>\n    \n    \n    <div class="module filtered" id="changelist">\n      <div class="changelist-form-container">\n        \n\n<div id="toolbar"><form id="changelist-search" method="get">\n<div><!-- DIV needed for valid HTML -->\n<label for="searchbar"><img src="/static/admin/img/search.svg" alt="Search"></label>\n<input type="text" size="40" name="q" value="" id="searchbar">\n<input type="submit" value="Search">\n\n\n</div>\n\n</form></div>\n\n\n          \n        <form id="changelist-form" method="post" novalidate=""><input type="hidden" name="csrfmiddlewaretoken" value="yVhu8j4FiqQLFulF602QRJpBNuNT0iHn4cAablwW0i9T8akZpgYcWfNvgahXTosv">\n        \n        \n          \n<div class="actions">\n  \n    \n    <label>Action: <select name="action" required="">\n  <option value="" selected="">---------</option>\n\n  <option value="delete_selected">Delete selected books</option>\n\n</select></label><input type="hidden" name="select_across" value="0" class="select-across">\n    \n    \n    <button type="submit" class="button" title="Run the selected action" name="index" value="0">Go</button>\n    \n    \n    \n        <span class="action-counter" data-actions-icnt="2">0 of 2 selected</span>\n        \n    \n    \n  \n</div>\n\n          \n\n\n<div class="results">\n<table id="result_list">\n<thead>\n<tr>\n\n<th scope="col" class="action-checkbox-column">\n   \n   <div class="text"><span><input type="checkbox" id="action-toggle"></span></div>\n   <div class="clear"></div>\n</th>\n<th scope="col" class="column-__str__">\n   \n   <div class="text"><span>Book</span></div>\n   <div class="clear"></div>\n</th>\n</tr>\n</thead>\n<tbody>\n\n\n<tr><td class="action-checkbox"><input type="checkbox" name="_selected_action" value="ada7a586-[36](https://github.com/openwisp/openwisp-utils/actions/runs/10221026912/job/28282626459#step:6:37)44-4f8a-8c1d-c4f808c78650" class="action-select"></td><th class="field-__str__"><a href="/admin/test_project/book/ada7a586-3644-4f8a-8c1d-c4f808c78650/change/">Book 1</a></th></tr>\n\n\n<tr><td class="action-checkbox"><input type="checkbox" name="_selected_action" value="65cd30a7-9ebf-4621-9890-5bc6ca4f6d75" class="action-select"></td><th class="field-__str__"><a href="/admin/test_project/book/65cd30a7-9ebf-4621-9890-5bc6ca4f6d75/change/">Book 2</a></th></tr>\n\n</tbody>\n</table>\n</div>\n\n\n          \n        \n        \n\n<p class="paginator">\n\n2 books\n\n\n</p>\n\n        </form>\n      </div>\n    </div>\n  </div>\n  \n\n          \n          <br class="clear">\n        </div>\n        <!-- END Content -->\n        \n<div id="ow-loading" class="ow-overlay">\n  <div class="ow-overlay-inner">\n    <div class="ow-loading-spinner"></div>\n  </div>\n</div>\n\n\n\n    <script src="/static/admin/js/menu.js"></script>\n\n\n    \n        <script src="/static/dummy.js"></script>\n    \n\n\n      </div>\n    </div>\n    </div>\n</div>\n<!-- END Container -->\n\n\n<span class="select2-container select2-container--admin-autocomplete select2-container--open" style="position: absolute; top: 154.297px; left: [37](https://github.com/openwisp/openwisp-utils/actions/runs/10221026912/job/28282626459#step:6:38)5.594px;"><span class="select2-dropdown ow2-autocomplete-dropdown select2-dropdown--below" dir="ltr" style="width: 222px;"><span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="0" autocomplete="off" autocorrect="off" autocapitalize="none" spellcheck="false" role="searchbox" aria-autocomplete="list" aria-controls="select2-id-shelf__id-dal-filter-results"></span><span class="select2-results"><ul class="select2-results__options" role="listbox" id="select2-id-shelf__id-dal-filter-results" aria-expanded="true" aria-hidden="false"><li class="select2-results__option loading-results" role="option" aria-disabled="true" data-select2-id="3">Searching…</li></ul></span></span></span></body></html>'

Steps To Reproduce Run in a loop until it fails

#!/bin/bash

while true; do
    # Run the Selenium test command
    SELENIUM_HEADLESS=1 ./manage.py test test_project.tests.test_selenium.TestAutocompleteFilter.test_autocomplete_shelf_filter
    
    # Check the exit code of the command
    if [ $? -ne 0 ]; then
        # If the command returns a non-zero exit code, break the loop
        break
    fi
done

# Send the beep command
beep

Expected behavior Test always passes.

nemesifier avatar Aug 02 '24 20:08 nemesifier