test_yaml.py 11 KB

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