test_yaml.py 14 KB

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