Select Git revision
test_versioning.py
-
Timm Fitschen authored
Currently, the main purpose is automatic testing for the server functionality which is used by the webui.
Timm Fitschen authoredCurrently, the main purpose is automatic testing for the server functionality which is used by the webui.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
test_versioning.py 6.94 KiB
# -*- coding: utf-8 -*-
#
# ** header v3.0
# This file is a part of the CaosDB Project.
#
# Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com>
# Copyright (C) 2020 IndiScale GmbH <info@indiscale.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# ** end header
#
from __future__ import absolute_import
from caosdb import Record
from caosdb.common.utils import xml2str
from caosdb.common.versioning import Version
from .test_property import testrecord
from lxml import etree
def test_constructor():
v = Version(id="1234abcd", date="2020-01-01T20:15:00.000UTC",
username="testuser", realm="CaosDB", is_head=True,
predecessors=[Version(id="2345abdc",
date="2020-01-01T20:00:00.000UTC")],
successors=[Version(id="3465abdc",
date="2020-01-01T20:30:00.000UTC")])
assert v.id == "1234abcd"
assert v.date == "2020-01-01T20:15:00.000UTC"
assert v.username == "testuser"
assert v.realm == "CaosDB"
assert v.is_head is True
assert isinstance(v.predecessors, list)
assert isinstance(v.predecessors[0], Version)
assert isinstance(v.successors, list)
assert isinstance(v.successors[0], Version)
return v
def test_to_xml():
v = test_constructor()
xmlstr = xml2str(v.to_xml())
assert xmlstr == ('<Version id="{i}" date="{d}" username="{u}" realm="{r}"'
' head="{h}">\n'
' <Predecessor id="{pi}" date="{pd}"/>\n'
' <Successor id="{si}" date="{sd}"/>\n'
'</Version>\n').format(i=v.id, d=v.date,
u=v.username, r=v.realm,
h=str(v.is_head).lower(),
pi=v.predecessors[0].id,
pd=v.predecessors[0].date,
si=v.successors[0].id,
sd=v.successors[0].date)
xmlstr2 = xml2str(v.to_xml(tag="OtherVersionTag"))
assert xmlstr2 == ('<OtherVersionTag id="{i}" date="{d}" username="{u}" '
'realm="{r}" head="{h}">\n'
' <Predecessor id="{pi}" date="{pd}"/>\n'
' <Successor id="{si}" date="{sd}"/>\n'
'</OtherVersionTag>\n'
).format(i=v.id, d=v.date, u=v.username, r=v.realm,
h=str(v.is_head).lower(),
pi=v.predecessors[0].id,
pd=v.predecessors[0].date,
si=v.successors[0].id, sd=v.successors[0].date)
def test_equality():
v = test_constructor()
assert hash(v) == hash(v)
v2 = test_constructor()
assert hash(v) == hash(v2)
assert v == v2
v = Version()
v2 = Version()
assert hash(v) == hash(v2)
assert v == v2
v = Version(id="123")
v2 = Version(id="123")
v3 = Version(id="2345")
assert hash(v) == hash(v2)
assert v == v2
assert hash(v) != hash(v3)
assert v != v3
v = Version(id="123", date="2345", predecessors=None)
v2 = Version(id="123", date="2345", predecessors=[])
v3 = Version(id="123", date="Another date", predecessors=[])
assert hash(v) == hash(v2)
assert v == v2
assert hash(v) != hash(v3)
assert v != v3
v = Version(id="123", date="2345", predecessors=[Version(id="bla")])
v2 = Version(id="123", date="2345", predecessors=[Version(id="bla")])
v3 = Version(id="123", date="2345", predecessors=[Version(id="blub")])
v4 = Version(id="123", date="2345", predecessors=[Version(id="bla"),
Version(id="bla")])
assert hash(v) == hash(v2)
assert v == v2
assert hash(v) != hash(v3)
assert v != v3
assert hash(v) != hash(v4)
assert v != v4
v = Version(id="123", date="2345", predecessors=[Version(id="bla")],
successors=[Version(id="234")])
v2 = Version(id="123", date="2345", predecessors=[Version(id="bla")],
successors=[Version(id="234")])
v3 = Version(id="123", date="2345", predecessors=[Version(id="bla")],
successors=[Version(id="bluup")])
assert hash(v) == hash(v2)
assert v == v2
assert hash(v) != hash(v3)
assert v != v3
def test_from_xml():
v = test_constructor()
xml = v.to_xml()
v2 = Version.from_xml(xml)
assert hash(v) == hash(v2)
assert v == v2
assert str(v) == str(v2)
def test_version_deserialization():
assert testrecord.version == Version(id="version-str",
date="2019-04-02T12:22:34.837UTC")
def test_version_serialization():
r = Record()
r.version = Version(id="test-version", date="asdfsadf")
# <Record><Version id="test-version" date="asdfsadf"/></Record>
assert "test-version" == r.to_xml().xpath("/Record/Version/@id")[0]
assert "asdfsadf" == r.to_xml().xpath("/Record/Version/@date")[0]
def test_get_history():
xml_str = """
<Version id="vid6" username="user1" realm="Realm1" date="date6" completeHistory="true">
<Predecessor id="vid5" username="user1" realm="Realm1" date="date5">
<Predecessor id="vid4" username="user1" realm="Realm1" date="date4">
<Predecessor id="vid3" username="user1" realm="Realm1" date="date3">
<Predecessor id="vid2" username="user1" realm="Realm1" date="date2">
<Predecessor id="vid1" username="user1" realm="Realm1" date="date1" />
</Predecessor>
</Predecessor>
</Predecessor>
</Predecessor>
<Successor id="vid7" username="user1" realm="Realm1" date="date7">
<Successor id="vid8" username="user1" realm="Realm1" date="date8">
<Successor id="vid9" username="user1" realm="Realm1" date="date9">
<Successor id="vid10" username="user1" realm="Realm1" date="date10" />
</Successor>
</Successor>
</Successor>
</Version>"""
version = Version.from_xml(etree.fromstring(xml_str))
assert version.is_complete_history is True
assert version.get_history() == [Version(id=f"vid{i+1}", date=f"date{i+1}",
username="user1", realm="Realm1")
for i in range(10)]