Added tests for --merge.
[0publish.git] / tests / testlocal.py
blobcbae914f4b373beb5f38ccab8cab68c62896e6e8
1 #!/usr/bin/env python2.4
2 import sys, logging, os, tempfile
3 from zeroinstall.injector.namespaces import XMLNS_IFACE
4 from zeroinstall.injector.reader import InvalidInterface
5 from zeroinstall.injector import model, reader
6 import unittest
7 from xml.dom import minidom
9 sys.path.insert(0, '..')
11 import create, merge
13 header = """<?xml version="1.0" ?>
14 <interface xmlns="http://zero-install.sourceforge.net/2004/injector/interface"
15 uri='http://test/hello.xml'>
16 <name>test</name>
17 <summary>for testing</summary>
18 <description>This is for testing.</description>
19 """
20 footer = """
21 </interface>
22 """
24 def parse(xml):
25 dom = minidom.parseString(xml)
26 uri = dom.documentElement.getAttribute('uri')
27 assert uri
29 tmp = tempfile.NamedTemporaryFile(prefix = 'test-')
30 try:
31 tmp.write(xml)
32 tmp.flush()
33 iface = model.Interface(uri)
34 reader.update(iface, tmp.name, local = True)
35 return iface
36 finally:
37 tmp.close()
39 local_file = os.path.join(os.path.dirname(__file__), 'local.xml')
40 local_file_req = os.path.join(os.path.dirname(__file__), 'local-req.xml')
42 def tap(s):
43 #print s
44 return s
46 class TestValidator(unittest.TestCase):
47 def testCreate(self):
48 master = parse(create.create_from_local(local_file))
49 assert master.uri == 'http://test/hello.xml', master
50 assert len(master.implementations) == 1
52 def testMergeFirst(self):
53 master = parse(merge.merge(header + footer, local_file))
54 assert master.uri == 'http://test/hello.xml', master
55 assert len(master.implementations) == 1
57 def testMergeSecond(self):
58 master = parse(merge.merge(header + "<implementation id='sha1=123' version='1'/>" + footer, local_file))
59 assert master.uri == 'http://test/hello.xml', master
60 assert len(master.implementations) == 2
62 def testMergeGroup(self):
63 master = parse(tap(merge.merge(header + "<group><implementation id='sha1=123' version='1'/></group>" + footer, local_file)))
64 assert master.uri == 'http://test/hello.xml', master
65 assert len(master.implementations) == 2
66 assert master.implementations['sha1=002'].requires == []
68 def testMergeLocalReq(self):
69 master = parse(tap(merge.merge(header + "<group x='x'><implementation id='sha1=123' version='1'/></group>" + footer, local_file_req)))
70 assert master.uri == 'http://test/hello.xml', master
71 assert len(master.implementations) == 2
72 deps = master.implementations['sha1=003'].requires
73 assert len(deps) == 1
74 #assert deps[0].interface == 'http://foo', deps[0]
76 def testLocalContext(self):
77 def get_context(xml_frag):
78 doc = minidom.parseString(header + xml_frag + footer)
79 impls = list(doc.getElementsByTagNameNS(XMLNS_IFACE, 'implementation'))
80 assert len(impls) == 1
81 return merge.Context(impls[0])
83 ctx = get_context("<implementation id='sha1=001' version='1'/>")
84 assert ctx.attribs[(None, 'id')] == 'sha1=001'
85 assert ctx.attribs[(None, 'version')] == '1'
87 ctx = get_context("<group t='t' x='1' y:z='2' xmlns:y='foo'><implementation id='sha1=001' version='1' t='r'/></group>")
88 assert ctx.attribs[(None, 'id')] == 'sha1=001'
89 assert ctx.attribs[(None, 'version')] == '1'
90 assert ctx.attribs[(None, 't')] == 'r'
91 assert ctx.attribs[(None, 'x')] == '1'
92 assert ctx.attribs[('foo', 'z')] == '2'
94 suite = unittest.makeSuite(TestValidator)
95 if __name__ == '__main__':
96 sys.argv.append('-v')
97 unittest.main()