Select Git revision
test_inheritance.py
-
Timm Fitschen authoredTimm Fitschen authored
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)]