Check the selenium console log for any issues as part of the test suite,

and fix/suppress errors found by that.
 - Legacy-Id: 19916
This commit is contained in:
Lars Eggert 2022-02-10 21:20:20 +00:00
parent 1795609816
commit 37cb737987
13 changed files with 855 additions and 6681 deletions

View file

@ -261,7 +261,6 @@ window.agenda_filter_for_testing; // methods to be accessed for automated testin
function register_handlers() {
$('.pickview')
.on("click", function () {
console.log("pickview");
if (is_disabled($(this))) { return; }
var fp = handle_pick_button($(this));
update_filters(fp);

View file

@ -1 +1 @@
import "bootstrap-datepicker";
import "bootstrap-datepicker/js/bootstrap-datepicker.js";

View file

@ -497,7 +497,7 @@ jQuery(document).ready(function () {
let originRadio = updateSwapRadios(swapDaysLabels, swapDaysRadios, originDay, 'day');
// Fill in label in the modal title
swapDaysModal.find(".modal-title .day").text(jQuery.trim(originRadio.parent().text()));
swapDaysModal.find(".modal-title .day").text(originRadio.parent().text().trim());
// Fill in the hidden form fields
swapDaysModal.find("input[name=source_day]").val(originDay);

View file

@ -19,6 +19,7 @@ $.fn.select2.defaults.set("escapeMarkup", function (m) {
window.setupSelect2Field = function (e) {
var url = e.data("ajax--url");
var maxEntries = e.data("max-entries");
var result_key = e.data("result-key");
var options = e.data("pre");
for (var id in options) {
e.append(new Option(options[id].text, options[id].id, false, options[id].selected));
@ -38,6 +39,10 @@ window.setupSelect2Field = function (e) {
};
},
processResults: function (results) {
if (result_key) {
// overwrite the returned "id" fields with the data in the result_key fields
results = results.map(x => ({ ...x, ...{ id: x[result_key] } }));
}
return {
results: results,
pagination: {

View file

@ -1,31 +1,32 @@
$(function () {
var form = $(".new-relation-row")
.closest("form");
var newRowHtml = form.find(".new-relation-row")
.get(0)
.outerHTML;
var counter = 1;
$(document)
.ready(function () {
var form = $(".new-relation-row")
.closest("form");
var newRowHtml = form.find(".new-relation-row")
.get(0)
.outerHTML;
var counter = 1;
form.on("click", ".delete", function (e) {
e.preventDefault();
$(this)
.closest(".input-group")
.remove();
});
form.on("click", ".delete", function (e) {
e.preventDefault();
$(this)
.closest(".input-group")
.remove();
});
form.on("keydown", ".new-relation-row input[type=text]", function () {
var top = $(this)
.closest(".new-relation-row");
top.removeClass("new-relation-row");
top.find(".delete")
.removeAttr('Disabled')
.removeClass("btn-outline-danger")
.addClass("btn-danger");
top.find("input,select")
.each(function () {
this.name += counter;
});
++counter;
top.after(newRowHtml);
});
});
form.on("keydown", ".new-relation-row input[type=text]", function () {
var top = $(this)
.closest(".new-relation-row");
top.removeClass("new-relation-row");
top.find(".delete")
.prop('Disabled', false)
.removeClass("btn-outline-danger")
.addClass("btn-danger");
top.find("input,select")
.each(function () {
this.name += counter;
});
++counter;
top.after(newRowHtml);
});
});

View file

@ -213,7 +213,7 @@ timeslotEdit = (function () {
let timeslotElts = Array.from(deleteModal.eltsToDelete); // make own copy as Array so we have .map()
ajaxDeleteTimeSlot(timeslotElts.map(elt => elt.dataset.timeslotPk))
.error(function (jqXHR) {
.fail(function (jqXHR) {
displayError('Error deleting timeslot: ' + jqXHR.responseText);
})
.done(function () {

View file

@ -25,7 +25,7 @@
<div class="row mb-3">
<label for="url1" class="col-form-label col-sm-2 fw-bold">From revision</label>
<div class="col-sm-10">
<select class="form-select" id="url1" name="url1">
<select class="form-select select2-field" data-max-entries="1" data-minimum-input-length="0" id="url1" name="url1">
{% for name, rev, time, url in diff_revisions %}
<option value="{{ url }}"
{% if diff_revisions|length > 1 and forloop.counter == 2 %} selected="selected"{% endif %}>
@ -46,7 +46,7 @@
<div class="row mb-3">
<label for="url2" class="col-form-label col-sm-2 fw-bold">To revision</label>
<div class="col-sm-10">
<select class="form-select" id="url2" name="url2">
<select class="form-select select2-field" data-max-entries="1" data-minimum-input-length="0" id="url2" name="url2">
{% for name, rev, time, url in diff_revisions %}
<option value="{{ url }}"
{% if forloop.counter == 1 %} selected="selected"{% endif %}>

View file

@ -3,10 +3,17 @@
{% origin %}
{% for rfc,choice_slug in form.relations.items %}
<div class="input-group mb-3">
<input class="form-control"
name="new_relation_row_{{ rfc }}"
type="text"
value="{{ rfc }}">
<select class="form-control select2-field"
data-ajax--url="{% url 'ietf.doc.views_search.ajax_select2_search_docs' model_name='document' doc_type='draft' %}"
data-max-entries="1"
data-width="resolve"
data-result-key="text"
name="new_relation_row_{{ rfc }}"
data-placeholder="Enter new affected RFC.">
<option id="{{ rfc|upper }}" selected>
{{ rfc|upper }}
</option>
</select>
<select class="form-select" name="statchg_relation_row_{{ rfc }}">
<option value="" {% if choice_slug == "" %}selected{% endif %}>
(None)
@ -22,10 +29,14 @@
</div>
{% endfor %}
<div class="input-group mb-3 new-relation-row">
<input name="new_relation_row_"
type="text"
class="form-control"
placeholder="Enter new affected RFC.">
<select name="new_relation_row_"
class="form-control select2-field"
data-ajax--url="{% url 'ietf.doc.views_search.ajax_select2_search_docs' model_name='document' doc_type='draft' %}"
data-result-key="text"
data-max-entries="1"
data-width="resolve"
data-placeholder="Enter new affected RFC.">
</select>
<select class="form-select" name="statchg_relation_row_">
<option value="" {% if choice_slug == "" %}selected{% endif %}>
(Select proposed new status.)

View file

@ -369,9 +369,9 @@
if (!weekview.hasClass('visually-hidden')) {
var queryparams = window.location.search;
if (queryparams) {
queryparams += '&tz=' + ietf_timezone.get_current_tz().toLowerCase();
queryparams += '&tz=' + encodeURI(ietf_timezone.get_current_tz().toLowerCase());
} else {
queryparams = '?tz=' + ietf_timezone.get_current_tz().toLowerCase();
queryparams = '?tz=' + encodeURI(ietf_timezone.get_current_tz().toLowerCase());
}
var new_url = 'week-view.html' + queryparams;
var wv_iframe = $(weekview).children('iframe');

View file

@ -13,11 +13,18 @@
{% csrf_token %}
<div class="mb-3">
<label class="form-label">I-D name</label>
<input type="text"
class="form-control"
placeholder="draft-..."
name="name"
value="{{ name|default:"" }}">
<select class="form-control select2-field"
data-placeholder="draft-..."
data-ajax--url="{% url 'ietf.doc.views_search.ajax_select2_search_docs' model_name='document' doc_type='draft' %}"
data-max-entries="1"
data-result-key="text"
name="name">
{% if name %}
<option id="{{ name }}" selected>
{{ name }}
</option>
{% endif %}
</select>
</div>
{% if error %}
<p class="alert alert-danger my-3">

View file

@ -1,6 +1,8 @@
# Copyright The IETF Trust 2014-2021, All Rights Reserved
# -*- coding: utf-8 -*-
import re
from django.urls import reverse as urlreverse
from unittest import skipIf
@ -12,6 +14,7 @@ try:
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
except ImportError as e:
skip_selenium = True
skip_message = "Skipping selenium tests: %s" % e
@ -38,10 +41,12 @@ def start_web_driver():
options.add_argument("disable-extensions")
options.add_argument("disable-gpu") # headless needs this
options.add_argument("no-sandbox") # docker needs this
dc = DesiredCapabilities.CHROME
dc["goog:loggingPrefs"] = {"browser": "ALL"}
# For selenium 3:
return webdriver.Chrome("chromedriver", options=options)
return webdriver.Chrome("chromedriver", options=options, desired_capabilities=dc)
# For selenium 4:
# return webdriver.Chrome(service=service, options=options)
# return webdriver.Chrome(service=service, options=options, desired_capabilities=dc)
def selenium_enabled():
@ -63,6 +68,24 @@ class IetfSeleniumTestCase(IetfLiveServerTestCase):
self.driver.set_window_size(1024,768)
def tearDown(self):
for type in ["browser", "driver"]:
log = self.driver.get_log(type)
if not log:
continue
for entry in log:
msg = entry["message"]
# suppress a bunch of benign/expected messages
if (
re.search(r"JQMIGRATE: Migrate is installed", msg)
or re.search(r"No headers fields visible, hiding", msg)
or re.search(r"No color for \w+: using default", msg)
or re.search(r"Invalid 'X-Frame-Options'", msg)
or re.search(r"Could not find parent", msg)
or re.search(r"Enabling nav", msg)
or re.search(r"/materials/.*mars.*status of 404", msg)
):
continue
self.test.assertEqual("", msg)
super(IetfSeleniumTestCase, self).tearDown()
self.driver.close()
@ -98,4 +121,4 @@ class presence_of_element_child_by_css_selector:
def __call__(self, driver):
child = self.element.find_element(By.CSS_SELECTOR, self.child_selector)
return child if child is not None else False
return child if child is not None else False

7382
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -4,7 +4,7 @@
"@fullcalendar/daygrid": "^5.10.1",
"@popperjs/core": "^2.10.2",
"bootstrap": "^5.1.3",
"bootstrap-datepicker": "^1.9.0",
"bootstrap-datepicker": "uxsolutions/bootstrap-datepicker",
"bootstrap-icons": "^1.7.0",
"d3": "^3.5.17",
"flot": "^4.2.2",