test_yaml.py 12 KB

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