| | 1 | # Copyright (c) 2007-2008 The PyAMF Project. |
| | 2 | # See LICENSE for details. |
| | 3 | |
| | 4 | """ |
| | 5 | PyAMF SQLAlchemy adapter tests. |
| | 6 | |
| | 7 | @since 0.4.0 |
| | 8 | """ |
| | 9 | import datetime |
| | 10 | import sys |
| | 11 | import unittest |
| | 12 | |
| | 13 | import sqlalchemy |
| | 14 | from sqlalchemy import MetaData, Table, Column, Integer, String, ForeignKey, \ |
| | 15 | create_engine |
| | 16 | from sqlalchemy.orm import mapper, relation, sessionmaker |
| | 17 | |
| | 18 | import pyamf |
| | 19 | import pyamf.flex |
| | 20 | |
| | 21 | class SATestCase(unittest.TestCase): |
| | 22 | |
| | 23 | def test_model(self): |
| | 24 | my_sa_user = self.User() |
| | 25 | my_sa_user.name = "Test user" |
| | 26 | self.session.save(my_sa_user) |
| | 27 | |
| | 28 | my_user = self.User() |
| | 29 | my_user.name = "Test user" |
| | 30 | |
| | 31 | self.session.commit() |
| | 32 | |
| | 33 | encoder = pyamf.get_encoder(pyamf.AMF3) |
| | 34 | encoder.writeElement(my_user) |
| | 35 | stream_value = encoder.stream.getvalue() |
| | 36 | |
| | 37 | encoder = pyamf.get_encoder(pyamf.AMF3) |
| | 38 | encoder.writeElement(my_sa_user) |
| | 39 | encoder.stream.getvalue() |
| | 40 | |
| | 41 | def test_array_collection(self): |
| | 42 | for i in range(0, 20): |
| | 43 | my_user = self.User() |
| | 44 | my_user.name = "Test user %d" % i |
| | 45 | self.session.save(my_user) |
| | 46 | |
| | 47 | users = self.session.query(self.User).all() |
| | 48 | |
| | 49 | ac = pyamf.flex.ArrayCollection([user for user in users]) |
| | 50 | |
| | 51 | encoder = pyamf.get_encoder(pyamf.AMF3) |
| | 52 | encoder.writeElement(ac) |
| | 53 | encoder.stream.getvalue() |
| | 54 | |
| | 55 | def test_complex_structure(self): |
| | 56 | user = self.User(name="test-user") |
| | 57 | user.addresses.append(self.Address(email_address="test@example.org")) |
| | 58 | for i, string in enumerate(['one', 'two', 'three']): |
| | 59 | addr = self.Address(email_address="%s@example.org" % string) |
| | 60 | addr.info.append(self.AddressInfo(data="%s-%d" % (string, i))) |
| | 61 | user.addresses.append(addr) |
| | 62 | |
| | 63 | encoder = pyamf.get_encoder(pyamf.AMF3) |
| | 64 | encoder.writeElement(user) |
| | 65 | data = encoder.stream.getvalue() |
| | 66 | |
| | 67 | expected_data = ( |
| | 68 | '\n\x0b\x01\tname\x06\x13test-user\x13addresses\t\t\x01\n\x0b\x01' |
| | 69 | '\x1bemail_address\x06!test@example.org\tuser\n\x00\x01\n\x0b\x01' |
| | 70 | '\tinfo\t\x03\x01\n\x0b\x01\tdata\x06\x0bone-0\x0faddress\n\x06' |
| | 71 | '\x01\x06\x06\x1fone@example.org\n\n\x00\x01\n\x0b\x01\x0c\t\x03' |
| | 72 | '\x01\n\x0b\x01\x0e\x06\x0btwo-1\x12\n\x0c\x01\x06\x06\x1ftwo@examp' |
| | 73 | 'le.org\n\n\x00\x01\n\x0b\x01\x0c\t\x03\x01\n\x0b\x01\x0e\x06\x0fth' |
| | 74 | 'ree-2\x12\n\x12\x01\x06\x06#three@example.org\n\n\x00\x01\x01') |
| | 75 | |
| | 76 | self.assertEqual(data, expected_data) |
| | 77 | |
| | 78 | |
| | 79 | def setUp(self): |
| | 80 | metadata = MetaData() |
| | 81 | engine = create_engine('sqlite:///:memory:', echo=False) |
| | 82 | |
| | 83 | Session = sessionmaker(bind=engine) |
| | 84 | |
| | 85 | self.session = Session() |
| | 86 | |
| | 87 | users_table = Table('users_table', metadata, |
| | 88 | Column('id', Integer, primary_key=True), |
| | 89 | Column('name', String(64))) |
| | 90 | |
| | 91 | addresses_table = Table('addresses_table', metadata, |
| | 92 | Column('id', Integer, primary_key=True), |
| | 93 | Column('user_id', Integer, |
| | 94 | ForeignKey('users_table.id')), |
| | 95 | Column('email_address', String(128))) |
| | 96 | |
| | 97 | address_information = Table('addrinfo_table', metadata, |
| | 98 | Column('id', Integer, primary_key=True), |
| | 99 | Column('addr_id', Integer, |
| | 100 | ForeignKey('addresses_table.id')), |
| | 101 | Column('data', String(128))) |
| | 102 | |
| | 103 | |
| | 104 | mapper(self.User, users_table, properties=dict( |
| | 105 | addresses=relation(self.Address, backref='user'), |
| | 106 | )) |
| | 107 | |
| | 108 | mapper(self.Address, addresses_table, properties=dict( |
| | 109 | info=relation(self.AddressInfo, backref='address'), |
| | 110 | )) |
| | 111 | |
| | 112 | mapper(self.AddressInfo, address_information) |
| | 113 | |
| | 114 | metadata.create_all(engine) |
| | 115 | |
| | 116 | |
| | 117 | def tearDown(self): |
| | 118 | from sqlalchemy.orm import clear_mappers |
| | 119 | clear_mappers() |
| | 120 | |
| | 121 | |
| | 122 | class User(object): |
| | 123 | def __init__(self, **kwargs): |
| | 124 | self.__dict__.update(kwargs) |
| | 125 | |
| | 126 | class Address(object): |
| | 127 | def __init__(self, **kwargs): |
| | 128 | self.__dict__.update(kwargs) |
| | 129 | |
| | 130 | class AddressInfo(object): |
| | 131 | def __init__(self, **kwargs): |
| | 132 | self.__dict__.update(kwargs) |
| | 133 | |
| | 134 | |
| | 135 | def suite(): |
| | 136 | suite = unittest.TestSuite() |
| | 137 | |
| | 138 | suite.addTest(unittest.makeSuite(SATestCase)) |
| | 139 | |
| | 140 | return suite |
| | 141 | |
| | 142 | if __name__ == '__main__': |
| | 143 | unittest.main(defaultTest='suite') |
| | 144 | No newline at end of file |