Functional tests for SchoolBell relationship RESTive views
==========================================================

First of all, we will need a schoolbell instance.  We will add it via
the web ZMI:

    >>> print http("""
    ... POST /@@contents.html HTTP/1.1
    ... Authorization: Basic mgr:mgrpw
    ... Content-Length: 81
    ... Content-Type: application/x-www-form-urlencoded
    ...
    ... type_name=BrowserAdd__schoolbell.app.app.SchoolBellApplication&\
    ... new_value=frogpond""")
    HTTP/1.1 303 See Other
    ...
    Location: http://localhost/@@contents.html
    ...

Also, we need the REST HTTP caller:

    >>> from schoolbell.app.rest.ftests import rest


We can add some groups with POST:

    >>> print rest("""
    ... POST /frogpond/groups/ HTTP/1.1
    ... Authorization: Basic mgr:mgrpw
    ... Content-Type: text/xml
    ...
    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="A Group"/>
    ... """)
    HTTP/1.1 201 Created
    ...
    Location: http://localhost/frogpond/groups/a-group
    <BLANKLINE>
    Object created: http://localhost/frogpond/groups/a-group


    >>> print rest("""
    ... POST /frogpond/groups/ HTTP/1.1
    ... Authorization: Basic mgr:mgrpw
    ... Content-Type: text/xml
    ...
    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Another group"/>
    ... """)
    HTTP/1.1 201 Created
    ...
    Location: http://localhost/frogpond/groups/another-group
    <BLANKLINE>
    Object created: http://localhost/frogpond/groups/another-group


    >>> print rest("""
    ... POST /frogpond/groups/ HTTP/1.1
    ... Authorization: Basic mgr:mgrpw
    ... Content-Type: text/xml
    ...
    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="One more group"/>
    ... """)
    HTTP/1.1 201 Created
    ...
    Location: http://localhost/frogpond/groups/one-more-group
    <BLANKLINE>
    Object created: http://localhost/frogpond/groups/one-more-group

Now some users:

    >>> print rest("""
    ... PUT /frogpond/persons/john HTTP/1.1
    ... Authorization: Basic mgr:mgrpw
    ... Content-Type: text/xml
    ...
    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="John"/>
    ... """)
    HTTP/1.1 201 Created
    ...

    >>> print rest("""
    ... PUT /frogpond/persons/pete HTTP/1.1
    ... Authorization: Basic mgr:mgrpw
    ... Content-Type: text/xml
    ...
    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Pete"/>
    ... """)
    HTTP/1.1 201 Created
    ...

    >>> print rest("""
    ... PUT /frogpond/persons/frog HTTP/1.1
    ... Authorization: Basic mgr:mgrpw
    ... Content-Type: text/xml
    ...
    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Frog"/>
    ... """)
    HTTP/1.1 201 Created
    ...

The list of relationships of persons should only contain the initial site-wide
calendar:

    >>> print rest("""
    ... GET /frogpond/persons/frog/relationships HTTP/1.1
    ... Authorization: Basic mgr:mgrpw
    ... """, handle_errors=False)
    HTTP/1.1 200 Ok
    ...
    <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
                   xmlns="http://schooltool.org/ns/model/0.1">
      <existing>
        <relationship xlink:type="simple"
                      xlink:role="http://schooltool.org/ns/calendar_subscription/provider"
                      xlink:arcrole="http://schooltool.org/ns/calendar_subscription"
                      xlink:href="http://localhost/frogpond/calendar">
          <manage xlink:type="simple"
                  xlink:href="http://localhost/frogpond/persons/frog/relationships/1"/>
        </relationship>
      </existing>
    </relationships>
    <BLANKLINE>

Groups have no relationships:

    >>> print rest("""
    ... GET /frogpond/groups/a-group/relationships HTTP/1.1
    ... Authorization: Basic mgr:mgrpw
    ... """)
    HTTP/1.1 200 Ok
    ...
    <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
                   xmlns="http://schooltool.org/ns/model/0.1">
      <existing>
      </existing>
    </relationships>

We can add some users by adding a relationship to our user:

    >>> print rest("""
    ... POST /frogpond/persons/john/relationships HTTP/1.1
    ... Authorization: Basic mgr:mgrpw
    ... Content-Type: text/xml
    ...
    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
    ...               xlink:type="simple"
    ...               xlink:role="http://schooltool.org/ns/membership/group"
    ...               xlink:arcrole="http://schooltool.org/ns/membership"
    ...               xlink:href="http://localhost/frogpond/groups/a-group"/>
    ... """, handle_errors=False)
    HTTP/1.1 201 Created
    ...

or our group:

    >>> print rest("""
    ... POST /frogpond/groups/a-group/relationships HTTP/1.1
    ... Authorization: Basic mgr:mgrpw
    ... Content-Type: text/xml
    ...
    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
    ...               xlink:type="simple"
    ...               xlink:role="http://schooltool.org/ns/membership/member"
    ...               xlink:arcrole="http://schooltool.org/ns/membership"
    ...               xlink:href="http://localhost/frogpond/persons/pete"/>
    ... """)
    HTTP/1.1 201 Created
    ...

We should see relationships we have just created:

    >>> print rest("""
    ... GET /frogpond/groups/a-group/relationships HTTP/1.1
    ... Authorization: Basic mgr:mgrpw
    ... """)
    HTTP/1.1 200 Ok
    ...
    <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
                   xmlns="http://schooltool.org/ns/model/0.1">
      <existing>
        <relationship xlink:type="simple"
                      xlink:role="http://schooltool.org/ns/membership/member"
                      xlink:arcrole="http://schooltool.org/ns/membership"
                      xlink:href="http://localhost/frogpond/persons/john">
          <manage xlink:type="simple"
                  xlink:href="http://localhost/frogpond/groups/a-group/relationships/1"/>
        </relationship>
        <relationship xlink:type="simple"
                      xlink:role="http://schooltool.org/ns/membership/member"
                      xlink:arcrole="http://schooltool.org/ns/membership"
                      xlink:href="http://localhost/frogpond/persons/pete">
          <manage xlink:type="simple"
                  xlink:href="http://localhost/frogpond/groups/a-group/relationships/2"/>
        </relationship>
      </existing>
    </relationships>

We can GET the relationship:

    >>> print rest("""
    ... GET /frogpond/groups/a-group/relationships/1 HTTP/1.1
    ... Authorization: Basic mgr:mgrpw
    ... """)
    HTTP/1.1 200 Ok
    ...
    <relationship xmlns:xlink="http://www.w3.org/1999/xlink"
                  xlink:type="simple"
                  xlink:role="http://schooltool.org/ns/membership/member"
                  xlink:arcrole="http://schooltool.org/ns/membership"
                  xlink:href="http://localhost/frogpond/persons/john"/>
    <BLANKLINE>

Or delete them:

    >>> print rest("""
    ... DELETE /frogpond/groups/a-group/relationships/1 HTTP/1.1
    ... Authorization: Basic mgr:mgrpw
    ... """)
    HTTP/1.1 200 Ok
    ...
    <BLANKLINE>
    Link removed

We just lost one of the relationships:

    >>> print rest("""
    ... GET /frogpond/groups/a-group/relationships HTTP/1.1
    ... Authorization: Basic mgr:mgrpw
    ... """)
    HTTP/1.1 200 Ok
    ...
    <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
                   xmlns="http://schooltool.org/ns/model/0.1">
      <existing>
        <relationship xlink:type="simple"
                      xlink:role="http://schooltool.org/ns/membership/member"
                      xlink:arcrole="http://schooltool.org/ns/membership"
                      xlink:href="http://localhost/frogpond/persons/pete">
          <manage xlink:type="simple"
                  xlink:href="http://localhost/frogpond/groups/a-group/relationships/2"/>
        </relationship>
      </existing>
    </relationships>

Lets see how permissions work:

    >>> print rest("""
    ... PUT /frogpond/persons/john/password HTTP/1.1
    ... Authorization: Basic mgr:mgrpw
    ...
    ... ann
    ... """)
    HTTP/1.1 200 Ok
    Content-Length: 0
    <BLANKLINE>

John should not be capable of adding himself back into the group:

    >>> print rest("""
    ... POST /frogpond/persons/john/relationships HTTP/1.1
    ... Authorization: Basic john:ann
    ... Content-Type: text/xml
    ...
    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
    ...               xlink:type="simple"
    ...               xlink:role="http://schooltool.org/ns/membership/group"
    ...               xlink:arcrole="http://schooltool.org/ns/membership"
    ...               xlink:href="http://localhost/frogpond/groups/a-group"/>
    ... """)
    HTTP/1.1 401 Unauthorized
    ...

Or deleting any relationships:

    >>> print rest("""
    ... DELETE /frogpond/groups/a-group/relationships/2 HTTP/1.1
    ... Authorization: Basic john:ann
    ... """)
    HTTP/1.1 401 Unauthorized
    ...

But should be capable of viewing relationships:

    >>> print rest("""
    ... GET /frogpond/groups/a-group/relationships/2 HTTP/1.1
    ... Authorization: Basic john:ann
    ... """)
    HTTP/1.1 200 Ok
    ...
    <relationship xmlns:xlink="http://www.w3.org/1999/xlink"
                  xlink:type="simple"
                  xlink:role="http://schooltool.org/ns/membership/member"
                  xlink:arcrole="http://schooltool.org/ns/membership"
                  xlink:href="http://localhost/frogpond/persons/pete"/>
    <BLANKLINE>

We can give him needed permissions though:

    >>> print rest("""
    ... POST /frogpond/persons/acl HTTP/1.1
    ... Authorization: Basic mgr:mgrpw
    ...
    ... <acl xmlns="http://schooltool.org/ns/model/0.1">
    ...   <principal id="sb.group.a-group">
    ...     <permission id="schoolbell.view" />
    ...     <permission id="schoolbell.edit" />
    ...     <permission id="schoolbell.create" />
    ...     <permission id="schoolbell.viewCalendar" setting="on" />
    ...     <permission id="schoolbell.addEvent" />
    ...     <permission id="schoolbell.modifyEvent" />
    ...     <permission id="schoolbell.controlAccess" />
    ...     <permission id="schoolbell.manageMembership" setting="on" />
    ...   </principal>
    ...   <principal id="sb.person.john">
    ...     <permission id="schoolbell.view" />
    ...     <permission id="schoolbell.edit" />
    ...     <permission id="schoolbell.create" />
    ...     <permission id="schoolbell.viewCalendar" />
    ...     <permission id="schoolbell.addEvent" />
    ...     <permission id="schoolbell.modifyEvent" />
    ...     <permission id="schoolbell.controlAccess" setting="on" />
    ...     <permission id="schoolbell.manageMembership" setting="on" />
    ...   </principal>
    ...   <principal id="sb.person.pete">
    ...     <permission id="schoolbell.view" />
    ...     <permission id="schoolbell.edit" />
    ...     <permission id="schoolbell.create" />
    ...     <permission id="schoolbell.viewCalendar" />
    ...     <permission id="schoolbell.addEvent" />
    ...     <permission id="schoolbell.modifyEvent" />
    ...     <permission id="schoolbell.controlAccess" setting="on" />
    ...     <permission id="schoolbell.manageMembership" setting="on" />
    ...   </principal>
    ... </acl>
    ... """)
    HTTP/1.1 200 Ok
    Content-Length: 19
    <BLANKLINE>
    Permissions updated

John should now be capable of adding himself back into the group:

    >>> print rest("""
    ... POST /frogpond/persons/john/relationships HTTP/1.1
    ... Authorization: Basic john:ann
    ... Content-Type: text/xml
    ...
    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
    ...               xlink:type="simple"
    ...               xlink:role="http://schooltool.org/ns/membership/group"
    ...               xlink:arcrole="http://schooltool.org/ns/membership"
    ...               xlink:href="http://localhost/frogpond/groups/a-group"/>
    ... """)
    HTTP/1.1 201 Created
    ...
    Location: http://localhost/frogpond/persons/john/relationships/2
    ...
    <BLANKLINE>
    Relationship created: http://localhost/frogpond/persons/john/relationships/2

He can delete the other relationship now too:

    >>> print rest("""
    ... DELETE /frogpond/persons/pete/relationships/1 HTTP/1.1
    ... Authorization: Basic john:ann
    ... """)
    HTTP/1.1 200 Ok
    ...
    <BLANKLINE>
    Link removed

Calendars have their relationships too:

    >>> print rest("""
    ... GET /frogpond/persons/frog/calendar/relationships HTTP/1.1
    ... Authorization: Basic mgr:mgrpw
    ... """, handle_errors=False)
    HTTP/1.1 200 Ok
    ...
    <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
                   xmlns="http://schooltool.org/ns/model/0.1">
      <existing>
      </existing>
    </relationships>
