test_yaml.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. # -*- coding: utf-8 -*-
  2. import pytest
  3. import os
  4. import pytz
  5. import yaml
  6. import dingguo
  7. import difflib
  8. import datetime
  9. def get_figure_a():
  10. return dingguo.Figure(12.3, u'km')
  11. def get_figure_b():
  12. return dingguo.Figure(12300, u'米')
  13. def get_sum_a():
  14. return dingguo.Sum(1.23, u'EUR')
  15. def get_sum_b():
  16. return dingguo.Sum(20.45, u'€')
  17. def get_item_a():
  18. return dingguo.Item(
  19. name = u'item a',
  20. price_brutto = get_sum_a(),
  21. )
  22. def get_item_b():
  23. return dingguo.Item(
  24. name = u'item β',
  25. price_brutto = get_sum_b(),
  26. )
  27. def get_person_a():
  28. return dingguo.Person(
  29. first_name = u'Fabian Peter',
  30. last_name = u'Hammerle',
  31. )
  32. def get_person_b():
  33. return dingguo.Person(
  34. first_name = u'名字',
  35. last_name = u'贵姓',
  36. )
  37. def get_article():
  38. return dingguo.Article(
  39. authors = ['a', 'b'],
  40. depth = dingguo.ScalarFigure(12.3, u'dm'),
  41. features = u'supergeil',
  42. height = dingguo.ScalarFigure(123., u'cm'),
  43. maximum_load = dingguo.ScalarFigure(40., u'kg'),
  44. name = u'article name',
  45. price_brutto = get_sum_a(),
  46. product_id = u'0815',
  47. quantity = 1,
  48. reseller = u'seller',
  49. shipper = u'shipper',
  50. state = u'goood',
  51. width = dingguo.ScalarFigure(1.23, u'm'),
  52. )
  53. def get_transportation():
  54. return dingguo.Transportation(
  55. name = u'ticket',
  56. price_brutto = get_sum_a(),
  57. departure_point = u'home',
  58. destination_point = u'city',
  59. distance = dingguo.Distance(3.21, u'km'),
  60. passenger = get_person_a(),
  61. valid_from = datetime.datetime(2016, 7, 14, 13, 50, 4, 0, tzinfo = pytz.timezone('Europe/Vienna')),
  62. )
  63. def get_taxi_ride():
  64. return dingguo.TaxiRide(
  65. name = u'taxi ride',
  66. price_brutto = get_sum_a(),
  67. departure_point = u'home',
  68. destination_point = u'city',
  69. distance = dingguo.Distance(3.21, u'km'),
  70. driver = u'driver',
  71. arrival_time = datetime.datetime(2016, 5, 2, 18, 10, tzinfo = pytz.timezone('Europe/Vienna')),
  72. departure_time = datetime.datetime(2016, 5, 2, 18, 25, tzinfo = pytz.timezone('Europe/Vienna')),
  73. )
  74. def get_discount_a():
  75. return dingguo.Discount(
  76. name = u'discount a',
  77. amount = get_sum_a(),
  78. )
  79. def get_discount_b():
  80. return dingguo.Discount(
  81. name = u'discount β',
  82. amount = get_sum_b(),
  83. )
  84. def get_order_a(items = True, discounts = True):
  85. order = dingguo.Order(
  86. platform = u'platformπ',
  87. order_id = u'id',
  88. order_date = datetime.datetime(2016, 5, 8, 0, 18, 17),
  89. customer_id = u'customer',
  90. )
  91. if items:
  92. order.items.append(get_item_a())
  93. order.items.append(get_item_b())
  94. if discounts:
  95. order.discounts.append(get_discount_a())
  96. order.discounts.append(get_discount_b())
  97. return order
  98. def get_order_b():
  99. order = dingguo.Order(
  100. platform = u'platformπ',
  101. order_id = u'order_b',
  102. order_date = datetime.datetime(2015, 5, 8, 0, 18, 17),
  103. )
  104. return order
  105. def get_order_c():
  106. order = dingguo.Order(
  107. platform = u'γάμμα',
  108. order_id = u'order_βήτα',
  109. order_date = datetime.datetime(2014, 5, 8, 0, 18, 17),
  110. customer_id = u'ρώ',
  111. )
  112. return order
  113. def get_distance():
  114. return dingguo.Distance(2.4142, u'km')
  115. def get_order_registry():
  116. registry = dingguo.OrderRegistry()
  117. registry.register(get_order_a(items = False, discounts = False))
  118. registry.register(get_order_b())
  119. registry.register(get_order_c())
  120. return registry
  121. def to_yaml(data):
  122. return yaml.dump(data, default_flow_style = False, allow_unicode = True).decode('utf-8')
  123. def yaml_diff(a, b):
  124. return '\n'.join(difflib.ndiff(
  125. to_yaml(a).split('\n'),
  126. to_yaml(b).split('\n'),
  127. ))
  128. @pytest.mark.parametrize('source_object,expected_yaml', [
  129. [datetime.datetime(2016, 7, 14, 13, 50, 4, 0), '2016-07-14 13:50:04\n...\n'],
  130. [datetime.datetime(2016, 7, 14, 13, 50, 4, 0, tzinfo = pytz.timezone('Europe/Vienna')), '2016-07-14 13:50:04+01:05\n...\n'],
  131. [datetime.datetime(2016, 7, 14, 13, 50, 4, 0, tzinfo = pytz.utc), '2016-07-14 13:50:04+00:00\n...\n'],
  132. [dingguo.Distance(1.34, u'km'), u"!distance '1.34 km'\n"],
  133. [dingguo.ScalarFigure(1.34, u'μm'), u"!scalar '1.34 μm'\n"],
  134. [get_discount_a(), u"!discount\namount: !sum '1.23 EUR'\nname: discount a\n"],
  135. [get_discount_b(), u"!discount\namount: !sum '20.45 EUR'\nname: discount β\n"],
  136. [get_figure_a(), u'!figure\nunit: km\nvalue: 12.3\n'],
  137. [get_figure_b(), u'!figure\nunit: 米\nvalue: 12300\n'],
  138. [get_item_a(), u"!item\nname: item a\nprice_brutto: !sum '1.23 EUR'\n"],
  139. [get_item_b(), u"!item\nname: item β\nprice_brutto: !sum '20.45 EUR'\n"],
  140. [get_person_a(), u'!person\nfirst_name: Fabian Peter\nlast_name: Hammerle\n'],
  141. [get_person_b(), u'!person\nfirst_name: 名字\nlast_name: 贵姓\n'],
  142. [get_sum_a(), u"!sum '1.23 EUR'\n"],
  143. [get_sum_b(), u"!sum '20.45 EUR'\n"],
  144. [get_order_a(), u"""!order
  145. customer_id: customer
  146. discounts:
  147. - !discount
  148. amount: !sum '1.23 EUR'
  149. name: discount a
  150. - !discount
  151. amount: !sum '20.45 EUR'
  152. name: discount β
  153. items:
  154. - !item
  155. name: item a
  156. price_brutto: !sum '1.23 EUR'
  157. - !item
  158. name: item β
  159. price_brutto: !sum '20.45 EUR'
  160. order_date: 2016-05-08
  161. order_id: id
  162. platform: platformπ
  163. """],
  164. [get_article(), u"""!article
  165. authors:
  166. - a
  167. - b
  168. delivery_date: null
  169. depth: !scalar '12.3 dm'
  170. features: supergeil
  171. height: !scalar '123.0 cm'
  172. maximum_load: !scalar '40.0 kg'
  173. name: article name
  174. price_brutto: !sum '1.23 EUR'
  175. product_id: 0815
  176. quantity: 1
  177. reseller: seller
  178. shipper: shipper
  179. state: goood
  180. width: !scalar '1.23 m'
  181. """],
  182. [get_transportation(), u"""!transportation
  183. departure_point: home
  184. destination_point: city
  185. distance: !distance '3.21 km'
  186. name: ticket
  187. passenger: !person
  188. first_name: Fabian Peter
  189. last_name: Hammerle
  190. price_brutto: !sum '1.23 EUR'
  191. valid_from: 2016-07-14 13:50:04+01:05
  192. """],
  193. [get_taxi_ride(), u"""!taxi-ride
  194. arrival_time: 2016-05-02 18:10:00+01:05
  195. departure_point: home
  196. departure_time: 2016-05-02 18:25:00+01:05
  197. destination_point: city
  198. distance: !distance '3.21 km'
  199. driver: driver
  200. name: taxi ride
  201. price_brutto: !sum '1.23 EUR'
  202. """],
  203. [get_order_registry(), u"""!order-registry
  204. platformπ:
  205. id: !order
  206. customer_id: customer
  207. discounts: []
  208. items: []
  209. order_date: 2016-05-08
  210. order_id: id
  211. platform: platformπ
  212. order_b: !order
  213. customer_id: null
  214. discounts: []
  215. items: []
  216. order_date: 2015-05-08
  217. order_id: order_b
  218. platform: platformπ
  219. γάμμα:
  220. order_βήτα: !order
  221. customer_id: ρώ
  222. discounts: []
  223. items: []
  224. order_date: 2014-05-08
  225. order_id: order_βήτα
  226. platform: γάμμα
  227. """],
  228. ])
  229. def test_to_yaml(source_object, expected_yaml):
  230. assert to_yaml(source_object) == expected_yaml
  231. @pytest.mark.parametrize('expected_object,source_yaml', [
  232. [datetime.datetime(2016, 7, 14, 13, 50, 4, 0), '2016-07-14 13:50:04'],
  233. [datetime.datetime(2016, 7, 14, 13, 50, 4, 0, tzinfo = pytz.timezone('Europe/Vienna')), '2016-07-14 13:50:04+01:05'],
  234. [datetime.datetime(2016, 7, 14, 13, 50, 4, 0, tzinfo = pytz.utc), '2016-07-14 13:50:04+00:00'],
  235. [dingguo.Distance(1.34, u'km'), u"!distance '1.34 km'\n"],
  236. [dingguo.ScalarFigure(1.34, u'μm'), u"!scalar '1.34 μm'"],
  237. [get_discount_a(), u"!discount\nname: discount a\namount: !sum '1.23 EUR'\n"],
  238. [get_discount_b(), u"!discount\nname: discount β\namount: !sum '20.45 EUR'\n"],
  239. [get_figure_a(), '!figure\nunit: km\nvalue: 12.3\n'],
  240. [get_figure_a(), u'!figure\nunit: km\nvalue: 12.3\n'],
  241. [get_figure_b(), '!figure\nunit: 米\nvalue: 12300\n'],
  242. [get_figure_b(), u'!figure\nunit: 米\nvalue: 12300\n'],
  243. [get_item_a(), u"!item\nname: item a\nprice_brutto: !sum '1.23 EUR'\n"],
  244. [get_item_a(), u"!item\nname: item a\nprice_brutto: !sum 1.23 EUR"],
  245. [get_item_a(), u"!item\nname: item a\nprice_brutto: !sum 1.23 €\n"],
  246. [get_item_b(), u"!item\nname: item β\nprice_brutto: !sum '20.45 EUR'\n"],
  247. [get_person_a(), '!person\nfirst_name: Fabian Peter\nlast_name: Hammerle\n'],
  248. [get_person_a(), u'!person\nfirst_name: Fabian Peter\nlast_name: Hammerle\n'],
  249. [get_person_b(), u'!person\nfirst_name: 名字\nlast_name: 贵姓\n'],
  250. [get_sum_a(), "!sum 1.23 €"],
  251. [get_sum_a(), u"!sum '1.23 EUR'"],
  252. [get_sum_a(), u"!sum '1.23 EUR'"],
  253. [get_sum_a(), u"!sum 1.23 EUR"],
  254. [get_sum_a(), u"!sum 1.23 €"],
  255. [[get_person_a(), get_person_b()], u"""
  256. - !person
  257. first_name: Fabian Peter
  258. last_name: Hammerle
  259. - !person
  260. first_name: 名字
  261. last_name: 贵姓"""],
  262. [get_transportation(), u"""!transportation
  263. departure_point: home
  264. destination_point: city
  265. distance: !distance '3.21 km'
  266. name: ticket
  267. price_brutto: !sum '1.23 EUR'
  268. route_map: null
  269. passenger: !person
  270. first_name: Fabian Peter
  271. last_name: Hammerle
  272. valid_from: 2016-07-14 13:50:04+01:05
  273. """],
  274. ])
  275. def test_from_yaml(expected_object, source_yaml):
  276. loaded_object = yaml.load(source_yaml)
  277. assert loaded_object == expected_object
  278. def test_order_from_yaml():
  279. order_loaded = yaml.load(u"""!order
  280. customer_id: customer
  281. discounts:
  282. - !discount
  283. amount: !sum '1.23 EUR'
  284. name: discount a
  285. - !discount
  286. amount: !sum '20.45 EUR'
  287. name: discount β
  288. items:
  289. - !item
  290. name: item a
  291. price_brutto: !sum '1.23 EUR'
  292. - !item
  293. name: item β
  294. price_brutto: !sum '20.45 EUR'
  295. order_date: 2016-05-08
  296. order_id: id
  297. platform: platformπ
  298. """)
  299. order_expected = get_order_a()
  300. assert order_expected == order_loaded, yaml_diff(order_expected, order_loaded)
  301. def test_article_from_yaml():
  302. assert get_article() == yaml.load(u"""!article
  303. authors:
  304. - a
  305. - b
  306. delivery_date: null
  307. features: supergeil
  308. name: article name
  309. price_brutto: !sum '1.23 EUR'
  310. product_id: 0815
  311. quantity: 1
  312. reseller: seller
  313. shipper: shipper
  314. state: goood
  315. depth: !scalar 12.3 dm
  316. height: !scalar 123.0 cm
  317. maximum_load: !scalar 40.0 kg
  318. width: !scalar 1.23 m
  319. """)
  320. def test_taxi_ride_from_yaml():
  321. assert get_taxi_ride() == yaml.load(u"""!taxi-ride
  322. arrival_time: 2016-05-02 18:10:00+01:05
  323. departure_point: home
  324. departure_time: 2016-05-02 18:25:00+01:05
  325. destination_point: city
  326. distance: !distance '3.21 km'
  327. driver: driver
  328. name: taxi ride
  329. price_brutto: !sum '1.23 EUR'
  330. route_map: null
  331. """)
  332. def test_order_registry_from_yaml():
  333. expected = get_order_registry()
  334. loaded = yaml.load(u"""!order-registry
  335. platformπ:
  336. id: !order
  337. customer_id: customer
  338. discounts: []
  339. order_date: 2016-05-08
  340. order_id: id
  341. platform: platformπ
  342. order_b: !order
  343. customer_id: null
  344. items: []
  345. order_date: 2015-05-08
  346. order_id: order_b
  347. platform: platformπ
  348. γάμμα:
  349. order_βήτα: !order
  350. customer_id: ρώ
  351. discounts: []
  352. items: []
  353. order_date: 2014-05-08
  354. order_id: order_βήτα
  355. platform: γάμμα
  356. """)
  357. assert expected == loaded, yaml_diff(expected, loaded)