Introduction

In this example, we implement a simple publish-subscribe -scenario for Plone with an AMQP message broker like RabbitMQ:

_images/pubsubdiagram.png

Setup

Let there be a Plone site called Site A:

git checkout https://github.com/datakurre/pubsubannouncements.git Site_A
cd Site_A

python bootstrap
bin/buildout

source bin/rabbitmq-env
bin/rabbitmq-server

bin/instance fg

This Site A has a view called @@send-announcement with a custom HTML form for sending or clearing the announcement that should be shown also on all the other site.

Then, let there be other Plone sites, and let’s call one of them Site B:

git checkout https://github.com/datakurre/pubsubannouncements.git Site_B
cd Site_B

python bootstrap
bin/buildout instance:http-address=8081

bin/instance fg

Those sites should immediately act upon on the announcement messages sent by Site A. In this case by making those announcements visible for all the current users.

Scenarios

When we have at least one (and preferrebly at least the two) Plone instance up and running, we still need to log in to each of them and create the actual Plone site. For this example, we should always use Plone as the site id.

Finally, we should be able to try this out.

Announcement is being delivered

Given I'm logged in as an admin
 When I open the announcement form
  And I submit a test announcement
  And I return to the front page
 Then the page displays my test announcement.

Announcement is being cleared

Given I'm logged in as an admin
  And I've sent a test announcement
 When I open the announcement form
  And I submit an empty announcement
  And I return to the front page
 Then the page no longer displays my test announcement.

Robot test source

Scenario Steps Explained

I’m logged in as an admin

Log in admin

I open the announcement form

Go to  ${PLONE_URL}/@@send-announcement

I submit a test announcement

Input text and validate  form.widgets.message  This is a test announcement!
Click button  Send

I return to the front page

Go to  ${PLONE_URL}

The page displays my test announcement.

Page should contain  This is a test announcement!

I’ve sent a test announcement

Go to  ${PLONE_URL}/@@send-announcement
Input text and validate  form.widgets.message  This is a test announcement!
Click button  Send

I submit an empty announcement

Click button  Send

The page no longer displays my test announcement.

Page should not contain  This is a test announcement!

Common Steps Explained

Log in admin

Logs the user into Plone with site owner name and password. The logged-in user will have Manager-role and all permissions.

Log in  ${SITE_OWNER_NAME}  ${SITE_OWNER_PASSWORD}

Input text and validate once

A helper keyword for setting text value of the located input field and checking that the value has been set.

This keyword should not be used directly, but only called the keyword Input text and validate.

Input text  ${locator}  ${text}
${value} =  Get value  ${locator}
Should be equal  ${text}  ${value}

Input text and validate

A helper keyword accepting ${locator} and ${text} and setting text value of the located input field and checking that the value has been set.

Actually, this should not be needed. This was added when CI tests were failing randomly, because of not all login form fields were always filled (probably due to a slow CI server). The need for this might indicate an issue in Selenium2Library.

${timeout} =  Get selenium timeout
Wait until keyword succeeds  ${timeout}  0.5s  Input text and validate once  ${locator}  ${text}

Log in

Goes to the Plone login form and Logs in the user with the given ${userid} and ${password}. The logged-in user will be left on the welcome page after the login.

Go to  ${PLONE_URL}/login_form
Page should contain button  Log in
Input text and validate  __ac_name  ${userid}
Input text and validate  __ac_password  ${password}
Click Button  Log in
Page should not contain button  Log in

Disclaimer

This package is intended as a simple example on how to implement and test an instant publish-subscribe -scenario between multiple Plone sites using collective.zamqp.

This package is not intended to be used in production as such.