Skip to content

Commit 8bf8c2e

Browse files
Merge pull request #13787 from rabbitmq/add-id-tag-to-some-management-ui-pages
Add queues and streams page and test suite
2 parents 8dd27ee + 0cb63bb commit 8bf8c2e

File tree

14 files changed

+381
-5
lines changed

14 files changed

+381
-5
lines changed

deps/rabbitmq_management/priv/www/js/tmpl/queue.ejs

+1-1
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@
395395
</div>
396396
<% } %>
397397

398-
<div class="section-hidden">
398+
<div class="section-hidden" id="delete">
399399
<h2>Delete</h2>
400400
<div class="hider">
401401
<form action="#/queues" method="delete" class="confirm-queue inline-form">

deps/rabbitmq_management/priv/www/js/tmpl/queues.ejs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11

22
<h1>Queues</h1>
3-
<div class="section">
3+
<div class="section" id="queues-paging-section">
44
<%= paginate_ui(queues, 'queues') %>
55
</div>
6-
<div class="updatable">
6+
<div class="updatable" id="queues-table-section">
77
<% if (queues.items.length > 0) { %>
88
<table class="list">
99
<thead>
@@ -222,7 +222,7 @@
222222
</div>
223223

224224
<% if (ac.canAccessVhosts()) { %>
225-
<div class="section-hidden">
225+
<div class="section-hidden" id="add-new-queue">
226226
<h2>Add a new queue</h2>
227227
<div class="hider">
228228
<form action="#/queues" method="put">

selenium/full-suite-management-ui

+1
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ mgt/definitions.sh
1919
mgt/exchanges.sh
2020
mgt/limits.sh
2121
mgt/mgt-only-exchanges.sh
22+
mgt/queuesAndStreams.sh

selenium/short-suite-management-ui

+1
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ authnz-mgt/oauth-with-uaa.sh
55
authnz-mgt/oauth-idp-initiated-with-uaa-and-prefix.sh
66
mgt/vhosts.sh
77
mgt/exchanges.sh
8+
mgt/queuesAndStreams.sh
89
mgt/limits.sh
910
mgt/amqp10-connections.sh
+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/usr/bin/env bash
2+
3+
SCRIPT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
4+
5+
TEST_CASES_PATH=/queuesAndStreams
6+
TEST_CONFIG_PATH=/basic-auth
7+
8+
source $SCRIPT/../../bin/suite_template $@
9+
run

selenium/test/pageobjects/BasePage.js

+16
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ module.exports = class BasePage {
4444
async selectRefreshOption(option) {
4545
return this.selectOption(SELECT_REFRESH, option)
4646
}
47+
4748
async waitForOverviewTab() {
4849
await this.driver.sleep(250)
4950
return this.waitForDisplayed(OVERVIEW_TAB)
@@ -119,6 +120,11 @@ module.exports = class BasePage {
119120
const select = await new Select(selectable)
120121
return select.selectByVisibleText(text)
121122
}
123+
async selectOptionByValue(locator, value) {
124+
let selectable = await this.waitForDisplayed(locator)
125+
const select = await new Select(selectable)
126+
return select.selectByValue(value)
127+
}
122128

123129
async getSelectableVhosts() {
124130
const table_model = await this.getSelectableOptions(SELECT_VHOSTS)
@@ -152,6 +158,16 @@ module.exports = class BasePage {
152158
} catch(e) {
153159
return Promise.resolve(false)
154160
}
161+
/*
162+
let element = await driver.findElement(FORM_POPUP)
163+
return this.driver.wait(until.elementIsVisible(element), this.timeout / 2,
164+
'Timed out after [timeout=' + this.timeout + ';polling=' + this.polling + '] awaiting till visible ' + element,
165+
this.polling / 2).then(function onWarningVisible(e) {
166+
return Promise.resolve(true)
167+
}, function onError(e) {
168+
return Promise.resolve(false)
169+
})
170+
*/
155171
}
156172

157173
async isPopupWarningNotDisplayed() {
+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const { By, Key, until, Builder } = require('selenium-webdriver')
2+
3+
const BasePage = require('./BasePage')
4+
5+
6+
const QUEUE_NAME = By.css('div#main h1 b')
7+
8+
const DELETE_SECTION = By.css('div#main div#delete')
9+
const DELETE_BUTTON = By.css('div#main div#delete input[type=submit]')
10+
11+
module.exports = class QueuePage extends BasePage {
12+
async isLoaded() {
13+
return this.waitForDisplayed(QUEUE_NAME)
14+
}
15+
async getName() {
16+
return this.getText(QUEUE_NAME)
17+
}
18+
async ensureDeleteQueueSectionIsVisible() {
19+
await this.click(DELETE_SECTION)
20+
return driver.findElement(DELETE_SECTION).isDisplayed()
21+
}
22+
async deleteQueue() {
23+
await this.click(DELETE_BUTTON)
24+
return this.acceptAlert()
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
const { By, Key, until, Builder } = require('selenium-webdriver')
2+
3+
const { delay } = require('../utils')
4+
5+
const BasePage = require('./BasePage')
6+
7+
8+
const PAGING_SECTION = By.css('div#queues-paging-section')
9+
const PAGING_SECTION_HEADER = By.css('div#queues-paging-section h2')
10+
const ADD_NEW_QUEUE_SECTION = By.css('div#add-new-queue')
11+
const FILTER_BY_QUEUE_NAME = By.css('div.filter input#queues-name')
12+
13+
const TABLE_SECTION = By.css('div#queues-table-section table')
14+
const FORM_QUEUE_NAME = By.css('div#add-new-queue form input[name="name"]')
15+
const FORM_QUEUE_TYPE = By.css('div#add-new-queue form select[name="queuetype"]')
16+
const ADD_BUTTON = By.css('div#add-new-queue form input[type=submit]')
17+
18+
module.exports = class QueuesAndStreamsPage extends BasePage {
19+
async isLoaded () {
20+
return this.waitForDisplayed(PAGING_SECTION)
21+
}
22+
async getPagingSectionHeaderText() {
23+
return this.getText(PAGING_SECTION_HEADER)
24+
}
25+
async getQueuesTable(firstNColumns) {
26+
return this.getTable(TABLE_SECTION, firstNColumns)
27+
}
28+
async clickOnQueue(vhost, name) {
29+
return this.click(By.css(
30+
"div#queues-table-section table.list tbody tr td a[href='#/queues/" + vhost + "/" + name + "']"))
31+
}
32+
async ensureAddQueueSectionIsVisible() {
33+
await this.click(ADD_NEW_QUEUE_SECTION)
34+
return driver.findElement(ADD_NEW_QUEUE_SECTION).isDisplayed()
35+
}
36+
async ensureAllQueuesSectionIsVisible() {
37+
await this.click(PAGING_SECTION)
38+
return driver.findElement(PAGING_SECTION).isDisplayed()
39+
}
40+
async fillInAddNewQueue(queueDetails) {
41+
await this.selectOptionByValue(FORM_QUEUE_TYPE, queueDetails.type)
42+
await delay(1000)
43+
await this.sendKeys(FORM_QUEUE_NAME, queueDetails.name)
44+
return this.click(ADD_BUTTON)
45+
}
46+
async filterQueues(filterValue) {
47+
await this.waitForDisplayed(FILTER_BY_QUEUE_NAME)
48+
return this.sendKeys(FILTER_BY_QUEUE_NAME, filterValue + Key.RETURN)
49+
}
50+
}
+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const { By, Key, until, Builder } = require('selenium-webdriver')
2+
3+
const BasePage = require('./BasePage')
4+
5+
6+
const STREAM_NAME = By.css('div#main h1 b')
7+
const DELETE_SECTION = By.css('div#main div#delete')
8+
const DELETE_BUTTON = By.css('div#main div#delete input[type=submit]')
9+
10+
11+
module.exports = class StreamPage extends BasePage {
12+
async isLoaded() {
13+
return this.waitForDisplayed(STREAM_NAME)
14+
}
15+
async getName() {
16+
return this.getText(STREAM_NAME)
17+
}
18+
async ensureDeleteQueueSectionIsVisible() {
19+
await this.click(DELETE_SECTION)
20+
return driver.findElement(DELETE_SECTION).isDisplayed()
21+
}
22+
async deleteStream() {
23+
await this.click(DELETE_BUTTON)
24+
return this.acceptAlert()
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
const { By, Key, until, Builder } = require('selenium-webdriver')
2+
require('chromedriver')
3+
const assert = require('assert')
4+
const { buildDriver, goToHome, captureScreensFor, teardown, delay } = require('../utils')
5+
6+
const LoginPage = require('../pageobjects/LoginPage')
7+
const OverviewPage = require('../pageobjects/OverviewPage')
8+
const QueuesAndStreamsPage = require('../pageobjects/QueuesAndStreamsPage')
9+
const QueuePage = require('../pageobjects/QueuePage')
10+
const StreamPage = require('../pageobjects/StreamPage')
11+
12+
describe('Classic queues', function () {
13+
let login
14+
let queuesAndStreams
15+
let queue
16+
let stream
17+
let overview
18+
let captureScreen
19+
let queueName
20+
21+
before(async function () {
22+
driver = buildDriver()
23+
await goToHome(driver)
24+
login = new LoginPage(driver)
25+
overview = new OverviewPage(driver)
26+
queuesAndStreams = new QueuesAndStreamsPage(driver)
27+
queue = new QueuePage(driver)
28+
stream = new StreamPage(driver)
29+
captureScreen = captureScreensFor(driver, __filename)
30+
31+
await login.login('management', 'guest')
32+
if (!await overview.isLoaded()) {
33+
throw new Error('Failed to login')
34+
}
35+
await overview.selectRefreshOption("Do not refresh")
36+
await overview.clickOnQueuesTab()
37+
38+
queueName = "test_" + Math.floor(Math.random() * 1000)
39+
})
40+
41+
it('add classic queue and view it', async function () {
42+
await queuesAndStreams.ensureAddQueueSectionIsVisible()
43+
44+
await queuesAndStreams.fillInAddNewQueue({"name" : queueName, "type" : "classic"})
45+
await delay(5000)
46+
await queuesAndStreams.filterQueues(queueName)
47+
await delay(2000)
48+
let table = await queuesAndStreams.getQueuesTable(5)
49+
assert.equal(1, table.length)
50+
assert.equal(table[0][0], '/')
51+
assert.equal(table[0][1], queueName)
52+
assert.equal(table[0][2], 'classic')
53+
assert.equal(table[0][4], 'running')
54+
55+
await queuesAndStreams.clickOnQueue("%2F", queueName)
56+
await queue.isLoaded()
57+
assert.equal(queueName, await queue.getName())
58+
59+
})
60+
61+
after(async function () {
62+
await queue.ensureDeleteQueueSectionIsVisible()
63+
await queue.deleteQueue()
64+
65+
await teardown(driver, this, captureScreen)
66+
})
67+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
const { By, Key, until, Builder } = require('selenium-webdriver')
2+
require('chromedriver')
3+
const assert = require('assert')
4+
const { buildDriver, goToHome, captureScreensFor, teardown, delay } = require('../utils')
5+
6+
const LoginPage = require('../pageobjects/LoginPage')
7+
const OverviewPage = require('../pageobjects/OverviewPage')
8+
const QueuesAndStreamsPage = require('../pageobjects/QueuesAndStreamsPage')
9+
const QueuePage = require('../pageobjects/QueuePage')
10+
const StreamPage = require('../pageobjects/StreamPage')
11+
12+
describe('Quorum queues', function () {
13+
let login
14+
let queuesAndStreams
15+
let queue
16+
let stream
17+
let overview
18+
let captureScreen
19+
20+
before(async function () {
21+
driver = buildDriver()
22+
await goToHome(driver)
23+
login = new LoginPage(driver)
24+
overview = new OverviewPage(driver)
25+
queuesAndStreams = new QueuesAndStreamsPage(driver)
26+
queue = new QueuePage(driver)
27+
stream = new StreamPage(driver)
28+
captureScreen = captureScreensFor(driver, __filename)
29+
30+
await login.login('management', 'guest')
31+
if (!await overview.isLoaded()) {
32+
throw new Error('Failed to login')
33+
}
34+
await overview.selectRefreshOption("Do not refresh")
35+
await overview.clickOnQueuesTab()
36+
37+
})
38+
it('add quorum queue and view it', async function () {
39+
await queuesAndStreams.ensureAddQueueSectionIsVisible()
40+
let queueName = "test_" + Math.floor(Math.random() * 1000)
41+
await queuesAndStreams.fillInAddNewQueue({"name" : queueName, "type" : "quorum"})
42+
await delay(5000)
43+
await queuesAndStreams.filterQueues(queueName)
44+
await delay(2000)
45+
let table = await queuesAndStreams.getQueuesTable(5)
46+
assert.equal(1, table.length)
47+
assert.equal(table[0][0], '/')
48+
assert.equal(table[0][1], queueName)
49+
assert.equal(table[0][2], 'quorum')
50+
assert.equal(table[0][4], 'running')
51+
52+
await queuesAndStreams.clickOnQueue("%2F", queueName)
53+
await queue.isLoaded()
54+
assert.equal(queueName, await queue.getName())
55+
56+
})
57+
58+
after(async function () {
59+
await queue.ensureDeleteQueueSectionIsVisible()
60+
await queue.deleteQueue()
61+
62+
await teardown(driver, this, captureScreen)
63+
})
64+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
const { By, Key, until, Builder } = require('selenium-webdriver')
2+
require('chromedriver')
3+
const assert = require('assert')
4+
const { buildDriver, goToHome, captureScreensFor, teardown, delay } = require('../utils')
5+
6+
const LoginPage = require('../pageobjects/LoginPage')
7+
const OverviewPage = require('../pageobjects/OverviewPage')
8+
const QueuesAndStreamsPage = require('../pageobjects/QueuesAndStreamsPage')
9+
const QueuePage = require('../pageobjects/QueuePage')
10+
const StreamPage = require('../pageobjects/StreamPage')
11+
12+
describe('Streams', function () {
13+
let login
14+
let queuesAndStreams
15+
let queue
16+
let stream
17+
let overview
18+
let captureScreen
19+
20+
before(async function () {
21+
driver = buildDriver()
22+
await goToHome(driver)
23+
login = new LoginPage(driver)
24+
overview = new OverviewPage(driver)
25+
queuesAndStreams = new QueuesAndStreamsPage(driver)
26+
queue = new QueuePage(driver)
27+
stream = new StreamPage(driver)
28+
captureScreen = captureScreensFor(driver, __filename)
29+
30+
await login.login('management', 'guest')
31+
if (!await overview.isLoaded()) {
32+
throw new Error('Failed to login')
33+
}
34+
await overview.selectRefreshOption("Do not refresh")
35+
await overview.clickOnQueuesTab()
36+
37+
})
38+
it('add stream and view it', async function () {
39+
await queuesAndStreams.ensureAddQueueSectionIsVisible()
40+
let queueName = "test_" + Math.floor(Math.random() * 1000)
41+
await queuesAndStreams.fillInAddNewQueue({"name" : queueName, "type" : "stream"})
42+
await delay(5000)
43+
await queuesAndStreams.filterQueues(queueName)
44+
await delay(2000)
45+
let table = await queuesAndStreams.getQueuesTable(5)
46+
assert.equal(1, table.length)
47+
assert.equal(table[0][0], '/')
48+
assert.equal(table[0][1], queueName)
49+
assert.equal(table[0][2], 'stream')
50+
assert.equal(table[0][4], 'running')
51+
52+
await queuesAndStreams.clickOnQueue("%2F", queueName)
53+
await stream.isLoaded()
54+
assert.equal(queueName, await stream.getName())
55+
56+
})
57+
58+
59+
after(async function () {
60+
await stream.ensureDeleteQueueSectionIsVisible()
61+
await stream.deleteStream()
62+
63+
await teardown(driver, this, captureScreen)
64+
})
65+
})

0 commit comments

Comments
 (0)