angular-gem 1.1.4 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (619) hide show
  1. data/CHANGELOG.md +4 -0
  2. data/README.md +4 -0
  3. data/Rakefile +2 -83
  4. data/lib/angular-gem/version.rb +1 -1
  5. data/lib/tasks/copy.rake +76 -0
  6. data/lib/tasks/tag.rake +42 -0
  7. data/test/dummy/log/test.log +1 -0
  8. data/test/dummy/tmp/cache/assets/D65/250/sprockets%2F54a960d46bb0b354e8bd46fa03f5e0e4 +0 -0
  9. data/test/dummy/tmp/cache/assets/D6A/FB0/sprockets%2F92721e9941b77adcfdfba3d060622de2 +0 -0
  10. data/test/dummy/tmp/cache/assets/E07/040/sprockets%2Ff55b8ce9d0f28ce36b768a1c7aeb2ef3 +0 -0
  11. data/vendor/assets/javascripts/1.0.7/angular-1.0.7.js +14847 -0
  12. data/vendor/assets/javascripts/1.0.7/angular-bootstrap-1.0.7.js +175 -0
  13. data/vendor/assets/javascripts/1.0.7/angular-bootstrap-prettify-1.0.7.js +1835 -0
  14. data/vendor/assets/javascripts/1.0.7/angular-cookies-1.0.7.js +185 -0
  15. data/vendor/assets/javascripts/1.0.7/angular-loader-1.0.7.js +277 -0
  16. data/vendor/assets/javascripts/1.0.7/angular-mocks-1.0.7.js +1788 -0
  17. data/vendor/assets/javascripts/1.0.7/angular-resource-1.0.7.js +457 -0
  18. data/vendor/assets/javascripts/1.0.7/angular-sanitize-1.0.7.js +537 -0
  19. data/vendor/assets/javascripts/1.0.7/angular-scenario-1.0.7.js +26310 -0
  20. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_af-na.js +98 -0
  21. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_af-za.js +98 -0
  22. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_af.js +98 -0
  23. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_am-et.js +98 -0
  24. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_am.js +98 -0
  25. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ar-001.js +98 -0
  26. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ar-ae.js +98 -0
  27. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ar-bh.js +98 -0
  28. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ar-dz.js +98 -0
  29. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ar-eg.js +98 -0
  30. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ar-iq.js +98 -0
  31. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ar-jo.js +98 -0
  32. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ar-kw.js +98 -0
  33. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ar-lb.js +98 -0
  34. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ar-ly.js +98 -0
  35. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ar-ma.js +98 -0
  36. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ar-om.js +98 -0
  37. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ar-qa.js +98 -0
  38. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ar-sa.js +98 -0
  39. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ar-sd.js +98 -0
  40. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ar-sy.js +98 -0
  41. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ar-tn.js +98 -0
  42. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ar-ye.js +98 -0
  43. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ar.js +98 -0
  44. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_bg-bg.js +98 -0
  45. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_bg.js +98 -0
  46. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_bn-bd.js +98 -0
  47. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_bn-in.js +98 -0
  48. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_bn.js +98 -0
  49. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ca-ad.js +98 -0
  50. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ca-es.js +98 -0
  51. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ca.js +98 -0
  52. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_chr.js +4 -0
  53. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_cs-cz.js +98 -0
  54. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_cs.js +98 -0
  55. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_cy.js +4 -0
  56. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_da-dk.js +98 -0
  57. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_da.js +98 -0
  58. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_de-at.js +98 -0
  59. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_de-be.js +98 -0
  60. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_de-ch.js +98 -0
  61. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_de-de.js +98 -0
  62. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_de-li.js +98 -0
  63. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_de-lu.js +98 -0
  64. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_de.js +98 -0
  65. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_el-cy.js +98 -0
  66. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_el-gr.js +98 -0
  67. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_el-polyton.js +4 -0
  68. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_el.js +98 -0
  69. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-as.js +98 -0
  70. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-au.js +98 -0
  71. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-bb.js +98 -0
  72. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-be.js +98 -0
  73. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-bm.js +98 -0
  74. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-bw.js +98 -0
  75. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-bz.js +98 -0
  76. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-ca.js +98 -0
  77. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-dsrt-us.js +98 -0
  78. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-dsrt.js +98 -0
  79. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-fm.js +98 -0
  80. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-gb.js +98 -0
  81. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-gu.js +98 -0
  82. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-gy.js +98 -0
  83. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-hk.js +98 -0
  84. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-ie.js +98 -0
  85. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-in.js +98 -0
  86. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-iso.js +98 -0
  87. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-jm.js +98 -0
  88. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-mh.js +98 -0
  89. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-mp.js +98 -0
  90. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-mt.js +98 -0
  91. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-mu.js +98 -0
  92. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-na.js +98 -0
  93. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-nz.js +98 -0
  94. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-ph.js +98 -0
  95. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-pk.js +98 -0
  96. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-pr.js +98 -0
  97. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-pw.js +98 -0
  98. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-sg.js +98 -0
  99. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-tc.js +98 -0
  100. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-tt.js +98 -0
  101. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-um.js +98 -0
  102. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-us.js +98 -0
  103. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-vg.js +98 -0
  104. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-vi.js +98 -0
  105. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-za.js +98 -0
  106. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-zw.js +98 -0
  107. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en-zz.js +4 -0
  108. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_en.js +98 -0
  109. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-419.js +98 -0
  110. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-ar.js +98 -0
  111. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-bo.js +98 -0
  112. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-cl.js +98 -0
  113. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-co.js +98 -0
  114. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-cr.js +98 -0
  115. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-do.js +98 -0
  116. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-ea.js +98 -0
  117. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-ec.js +98 -0
  118. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-es.js +98 -0
  119. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-gq.js +98 -0
  120. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-gt.js +98 -0
  121. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-hn.js +98 -0
  122. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-ic.js +98 -0
  123. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-mx.js +98 -0
  124. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-ni.js +98 -0
  125. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-pa.js +98 -0
  126. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-pe.js +98 -0
  127. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-pr.js +98 -0
  128. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-py.js +98 -0
  129. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-sv.js +98 -0
  130. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-us.js +98 -0
  131. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-uy.js +98 -0
  132. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es-ve.js +98 -0
  133. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_es.js +98 -0
  134. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_et-ee.js +98 -0
  135. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_et.js +98 -0
  136. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_eu-es.js +98 -0
  137. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_eu.js +98 -0
  138. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fa-af.js +98 -0
  139. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fa-ir.js +98 -0
  140. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fa.js +98 -0
  141. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fi-fi.js +98 -0
  142. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fi.js +98 -0
  143. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fil-ph.js +98 -0
  144. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fil.js +98 -0
  145. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-be.js +98 -0
  146. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-bf.js +98 -0
  147. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-bi.js +98 -0
  148. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-bj.js +98 -0
  149. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-bl.js +98 -0
  150. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-ca.js +98 -0
  151. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-cd.js +98 -0
  152. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-cf.js +98 -0
  153. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-cg.js +98 -0
  154. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-ch.js +98 -0
  155. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-ci.js +98 -0
  156. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-cm.js +98 -0
  157. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-dj.js +98 -0
  158. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-fr.js +98 -0
  159. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-ga.js +98 -0
  160. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-gf.js +98 -0
  161. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-gn.js +98 -0
  162. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-gp.js +98 -0
  163. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-gq.js +98 -0
  164. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-km.js +98 -0
  165. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-lu.js +98 -0
  166. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-mc.js +98 -0
  167. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-mf.js +98 -0
  168. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-mg.js +98 -0
  169. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-ml.js +98 -0
  170. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-mq.js +98 -0
  171. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-ne.js +98 -0
  172. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-re.js +98 -0
  173. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-rw.js +98 -0
  174. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-sn.js +98 -0
  175. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-td.js +98 -0
  176. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-tg.js +98 -0
  177. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr-yt.js +98 -0
  178. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_fr.js +98 -0
  179. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_gl-es.js +98 -0
  180. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_gl.js +98 -0
  181. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_gsw-ch.js +98 -0
  182. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_gsw.js +98 -0
  183. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_gu-in.js +98 -0
  184. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_gu.js +98 -0
  185. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_haw.js +4 -0
  186. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_he-il.js +98 -0
  187. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_he.js +98 -0
  188. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_hi-in.js +98 -0
  189. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_hi.js +98 -0
  190. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_hr-hr.js +98 -0
  191. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_hr.js +98 -0
  192. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_hu-hu.js +98 -0
  193. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_hu.js +98 -0
  194. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_id-id.js +98 -0
  195. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_id.js +98 -0
  196. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_in.js +98 -0
  197. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_is-is.js +98 -0
  198. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_is.js +98 -0
  199. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_it-ch.js +98 -0
  200. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_it-it.js +98 -0
  201. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_it-sm.js +98 -0
  202. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_it.js +98 -0
  203. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_iw.js +98 -0
  204. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ja-jp.js +98 -0
  205. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ja.js +98 -0
  206. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_kn-in.js +98 -0
  207. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_kn.js +98 -0
  208. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ko-kr.js +98 -0
  209. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ko.js +98 -0
  210. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ln-cd.js +98 -0
  211. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ln-cg.js +98 -0
  212. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ln.js +98 -0
  213. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_lt-lt.js +98 -0
  214. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_lt.js +98 -0
  215. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_lv-lv.js +98 -0
  216. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_lv.js +98 -0
  217. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ml-in.js +98 -0
  218. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ml.js +98 -0
  219. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_mo.js +4 -0
  220. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_mr-in.js +98 -0
  221. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_mr.js +98 -0
  222. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ms-bn.js +98 -0
  223. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ms-my.js +98 -0
  224. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ms.js +98 -0
  225. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_mt-mt.js +98 -0
  226. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_mt.js +98 -0
  227. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_nl-aw.js +98 -0
  228. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_nl-be.js +98 -0
  229. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_nl-cw.js +98 -0
  230. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_nl-nl.js +98 -0
  231. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_nl-sx.js +98 -0
  232. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_nl.js +98 -0
  233. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_no.js +98 -0
  234. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_or-in.js +98 -0
  235. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_or.js +98 -0
  236. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_pl-pl.js +98 -0
  237. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_pl.js +98 -0
  238. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_pt-ao.js +98 -0
  239. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_pt-br.js +98 -0
  240. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_pt-gw.js +98 -0
  241. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_pt-mz.js +98 -0
  242. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_pt-pt.js +98 -0
  243. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_pt-st.js +98 -0
  244. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_pt.js +98 -0
  245. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ro-md.js +98 -0
  246. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ro-ro.js +98 -0
  247. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ro.js +98 -0
  248. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ru-md.js +98 -0
  249. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ru-ru.js +98 -0
  250. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ru-ua.js +98 -0
  251. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ru.js +98 -0
  252. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sk-sk.js +98 -0
  253. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sk.js +98 -0
  254. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sl-si.js +98 -0
  255. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sl.js +98 -0
  256. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sq-al.js +98 -0
  257. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sq.js +98 -0
  258. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sr-cyrl-ba.js +98 -0
  259. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sr-cyrl-me.js +98 -0
  260. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sr-cyrl-rs.js +98 -0
  261. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sr-cyrl.js +98 -0
  262. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sr-latn-ba.js +98 -0
  263. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sr-latn-me.js +98 -0
  264. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sr-latn-rs.js +98 -0
  265. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sr-latn.js +98 -0
  266. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sr-rs.js +4 -0
  267. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sr.js +98 -0
  268. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sv-fi.js +98 -0
  269. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sv-se.js +98 -0
  270. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sv.js +98 -0
  271. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sw-ke.js +98 -0
  272. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sw-tz.js +98 -0
  273. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_sw.js +98 -0
  274. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ta-in.js +98 -0
  275. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ta-lk.js +98 -0
  276. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ta.js +98 -0
  277. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_te-in.js +98 -0
  278. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_te.js +98 -0
  279. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_th-th.js +98 -0
  280. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_th.js +98 -0
  281. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_tl-ph.js +4 -0
  282. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_tl.js +98 -0
  283. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_tr-tr.js +98 -0
  284. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_tr.js +98 -0
  285. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_uk-ua.js +98 -0
  286. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_uk.js +98 -0
  287. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ur-in.js +98 -0
  288. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ur-pk.js +98 -0
  289. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_ur.js +98 -0
  290. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_vi-vn.js +98 -0
  291. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_vi.js +98 -0
  292. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_zh-cn.js +98 -0
  293. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_zh-hans-cn.js +98 -0
  294. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_zh-hans-hk.js +98 -0
  295. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_zh-hans-mo.js +98 -0
  296. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_zh-hans-sg.js +98 -0
  297. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_zh-hans.js +98 -0
  298. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_zh-hant-hk.js +98 -0
  299. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_zh-hant-mo.js +98 -0
  300. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_zh-hant-tw.js +98 -0
  301. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_zh-hant.js +98 -0
  302. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_zh-hk.js +98 -0
  303. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_zh-tw.js +98 -0
  304. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_zh.js +98 -0
  305. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_zu-za.js +98 -0
  306. data/vendor/assets/javascripts/1.0.7/i18n/angular-locale_zu.js +98 -0
  307. data/vendor/assets/javascripts/1.1.5/angular-1.1.5.js +16876 -0
  308. data/vendor/assets/javascripts/1.1.5/angular-cookies-1.1.5.js +185 -0
  309. data/vendor/assets/javascripts/1.1.5/angular-loader-1.1.5.js +304 -0
  310. data/vendor/assets/javascripts/1.1.5/angular-mobile-1.1.5.js +460 -0
  311. data/vendor/assets/javascripts/1.1.5/angular-mocks-1.1.5.js +1886 -0
  312. data/vendor/assets/javascripts/1.1.5/angular-resource-1.1.5.js +537 -0
  313. data/vendor/assets/javascripts/1.1.5/angular-sanitize-1.1.5.js +558 -0
  314. data/vendor/assets/javascripts/1.1.5/angular-scenario-1.1.5.js +28463 -0
  315. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_af-na.js +98 -0
  316. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_af-za.js +98 -0
  317. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_af.js +98 -0
  318. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_am-et.js +98 -0
  319. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_am.js +98 -0
  320. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ar-001.js +98 -0
  321. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ar-ae.js +98 -0
  322. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ar-bh.js +98 -0
  323. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ar-dz.js +98 -0
  324. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ar-eg.js +98 -0
  325. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ar-iq.js +98 -0
  326. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ar-jo.js +98 -0
  327. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ar-kw.js +98 -0
  328. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ar-lb.js +98 -0
  329. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ar-ly.js +98 -0
  330. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ar-ma.js +98 -0
  331. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ar-om.js +98 -0
  332. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ar-qa.js +98 -0
  333. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ar-sa.js +98 -0
  334. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ar-sd.js +98 -0
  335. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ar-sy.js +98 -0
  336. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ar-tn.js +98 -0
  337. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ar-ye.js +98 -0
  338. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ar.js +98 -0
  339. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_bg-bg.js +98 -0
  340. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_bg.js +98 -0
  341. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_bn-bd.js +98 -0
  342. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_bn-in.js +98 -0
  343. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_bn.js +98 -0
  344. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ca-ad.js +98 -0
  345. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ca-es.js +98 -0
  346. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ca.js +98 -0
  347. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_chr.js +4 -0
  348. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_cs-cz.js +98 -0
  349. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_cs.js +98 -0
  350. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_cy.js +4 -0
  351. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_da-dk.js +98 -0
  352. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_da.js +98 -0
  353. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_de-at.js +98 -0
  354. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_de-be.js +98 -0
  355. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_de-ch.js +98 -0
  356. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_de-de.js +98 -0
  357. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_de-li.js +98 -0
  358. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_de-lu.js +98 -0
  359. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_de.js +98 -0
  360. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_el-cy.js +98 -0
  361. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_el-gr.js +98 -0
  362. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_el-polyton.js +4 -0
  363. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_el.js +98 -0
  364. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-as.js +98 -0
  365. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-au.js +98 -0
  366. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-bb.js +98 -0
  367. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-be.js +98 -0
  368. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-bm.js +98 -0
  369. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-bw.js +98 -0
  370. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-bz.js +98 -0
  371. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-ca.js +98 -0
  372. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-dsrt-us.js +98 -0
  373. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-dsrt.js +98 -0
  374. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-fm.js +98 -0
  375. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-gb.js +98 -0
  376. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-gu.js +98 -0
  377. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-gy.js +98 -0
  378. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-hk.js +98 -0
  379. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-ie.js +98 -0
  380. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-in.js +98 -0
  381. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-iso.js +98 -0
  382. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-jm.js +98 -0
  383. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-mh.js +98 -0
  384. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-mp.js +98 -0
  385. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-mt.js +98 -0
  386. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-mu.js +98 -0
  387. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-na.js +98 -0
  388. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-nz.js +98 -0
  389. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-ph.js +98 -0
  390. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-pk.js +98 -0
  391. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-pr.js +98 -0
  392. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-pw.js +98 -0
  393. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-sg.js +98 -0
  394. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-tc.js +98 -0
  395. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-tt.js +98 -0
  396. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-um.js +98 -0
  397. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-us.js +98 -0
  398. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-vg.js +98 -0
  399. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-vi.js +98 -0
  400. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-za.js +98 -0
  401. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-zw.js +98 -0
  402. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en-zz.js +4 -0
  403. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_en.js +98 -0
  404. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-419.js +98 -0
  405. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-ar.js +98 -0
  406. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-bo.js +98 -0
  407. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-cl.js +98 -0
  408. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-co.js +98 -0
  409. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-cr.js +98 -0
  410. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-do.js +98 -0
  411. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-ea.js +98 -0
  412. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-ec.js +98 -0
  413. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-es.js +98 -0
  414. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-gq.js +98 -0
  415. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-gt.js +98 -0
  416. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-hn.js +98 -0
  417. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-ic.js +98 -0
  418. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-mx.js +98 -0
  419. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-ni.js +98 -0
  420. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-pa.js +98 -0
  421. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-pe.js +98 -0
  422. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-pr.js +98 -0
  423. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-py.js +98 -0
  424. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-sv.js +98 -0
  425. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-us.js +98 -0
  426. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-uy.js +98 -0
  427. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es-ve.js +98 -0
  428. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_es.js +98 -0
  429. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_et-ee.js +98 -0
  430. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_et.js +98 -0
  431. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_eu-es.js +98 -0
  432. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_eu.js +98 -0
  433. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fa-af.js +98 -0
  434. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fa-ir.js +98 -0
  435. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fa.js +98 -0
  436. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fi-fi.js +98 -0
  437. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fi.js +98 -0
  438. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fil-ph.js +98 -0
  439. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fil.js +98 -0
  440. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-be.js +98 -0
  441. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-bf.js +98 -0
  442. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-bi.js +98 -0
  443. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-bj.js +98 -0
  444. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-bl.js +98 -0
  445. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-ca.js +98 -0
  446. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-cd.js +98 -0
  447. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-cf.js +98 -0
  448. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-cg.js +98 -0
  449. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-ch.js +98 -0
  450. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-ci.js +98 -0
  451. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-cm.js +98 -0
  452. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-dj.js +98 -0
  453. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-fr.js +98 -0
  454. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-ga.js +98 -0
  455. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-gf.js +98 -0
  456. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-gn.js +98 -0
  457. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-gp.js +98 -0
  458. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-gq.js +98 -0
  459. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-km.js +98 -0
  460. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-lu.js +98 -0
  461. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-mc.js +98 -0
  462. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-mf.js +98 -0
  463. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-mg.js +98 -0
  464. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-ml.js +98 -0
  465. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-mq.js +98 -0
  466. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-ne.js +98 -0
  467. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-re.js +98 -0
  468. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-rw.js +98 -0
  469. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-sn.js +98 -0
  470. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-td.js +98 -0
  471. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-tg.js +98 -0
  472. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr-yt.js +98 -0
  473. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_fr.js +98 -0
  474. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_gl-es.js +98 -0
  475. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_gl.js +98 -0
  476. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_gsw-ch.js +98 -0
  477. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_gsw.js +98 -0
  478. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_gu-in.js +98 -0
  479. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_gu.js +98 -0
  480. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_haw.js +4 -0
  481. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_he-il.js +98 -0
  482. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_he.js +98 -0
  483. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_hi-in.js +98 -0
  484. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_hi.js +98 -0
  485. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_hr-hr.js +98 -0
  486. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_hr.js +98 -0
  487. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_hu-hu.js +98 -0
  488. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_hu.js +98 -0
  489. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_id-id.js +98 -0
  490. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_id.js +98 -0
  491. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_in.js +98 -0
  492. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_is-is.js +98 -0
  493. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_is.js +98 -0
  494. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_it-ch.js +98 -0
  495. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_it-it.js +98 -0
  496. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_it-sm.js +98 -0
  497. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_it.js +98 -0
  498. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_iw.js +98 -0
  499. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ja-jp.js +98 -0
  500. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ja.js +98 -0
  501. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_kn-in.js +98 -0
  502. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_kn.js +98 -0
  503. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ko-kr.js +98 -0
  504. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ko.js +98 -0
  505. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ln-cd.js +98 -0
  506. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ln-cg.js +98 -0
  507. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ln.js +98 -0
  508. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_lt-lt.js +98 -0
  509. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_lt.js +98 -0
  510. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_lv-lv.js +98 -0
  511. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_lv.js +98 -0
  512. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ml-in.js +98 -0
  513. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ml.js +98 -0
  514. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_mo.js +4 -0
  515. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_mr-in.js +98 -0
  516. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_mr.js +98 -0
  517. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ms-bn.js +98 -0
  518. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ms-my.js +98 -0
  519. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ms.js +98 -0
  520. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_mt-mt.js +98 -0
  521. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_mt.js +98 -0
  522. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_nl-aw.js +98 -0
  523. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_nl-be.js +98 -0
  524. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_nl-cw.js +98 -0
  525. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_nl-nl.js +98 -0
  526. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_nl-sx.js +98 -0
  527. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_nl.js +98 -0
  528. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_no.js +98 -0
  529. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_or-in.js +98 -0
  530. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_or.js +98 -0
  531. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_pl-pl.js +98 -0
  532. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_pl.js +98 -0
  533. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_pt-ao.js +98 -0
  534. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_pt-br.js +98 -0
  535. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_pt-gw.js +98 -0
  536. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_pt-mz.js +98 -0
  537. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_pt-pt.js +98 -0
  538. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_pt-st.js +98 -0
  539. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_pt.js +98 -0
  540. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ro-md.js +98 -0
  541. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ro-ro.js +98 -0
  542. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ro.js +98 -0
  543. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ru-md.js +98 -0
  544. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ru-ru.js +98 -0
  545. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ru-ua.js +98 -0
  546. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ru.js +98 -0
  547. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sk-sk.js +98 -0
  548. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sk.js +98 -0
  549. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sl-si.js +98 -0
  550. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sl.js +98 -0
  551. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sq-al.js +98 -0
  552. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sq.js +98 -0
  553. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sr-cyrl-ba.js +98 -0
  554. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sr-cyrl-me.js +98 -0
  555. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sr-cyrl-rs.js +98 -0
  556. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sr-cyrl.js +98 -0
  557. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sr-latn-ba.js +98 -0
  558. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sr-latn-me.js +98 -0
  559. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sr-latn-rs.js +98 -0
  560. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sr-latn.js +98 -0
  561. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sr-rs.js +4 -0
  562. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sr.js +98 -0
  563. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sv-fi.js +98 -0
  564. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sv-se.js +98 -0
  565. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sv.js +98 -0
  566. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sw-ke.js +98 -0
  567. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sw-tz.js +98 -0
  568. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_sw.js +98 -0
  569. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ta-in.js +98 -0
  570. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ta-lk.js +98 -0
  571. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ta.js +98 -0
  572. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_te-in.js +98 -0
  573. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_te.js +98 -0
  574. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_th-th.js +98 -0
  575. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_th.js +98 -0
  576. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_tl-ph.js +4 -0
  577. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_tl.js +98 -0
  578. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_tr-tr.js +98 -0
  579. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_tr.js +98 -0
  580. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_uk-ua.js +98 -0
  581. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_uk.js +98 -0
  582. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ur-in.js +98 -0
  583. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ur-pk.js +98 -0
  584. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_ur.js +98 -0
  585. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_vi-vn.js +98 -0
  586. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_vi.js +98 -0
  587. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_zh-cn.js +98 -0
  588. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_zh-hans-cn.js +98 -0
  589. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_zh-hans-hk.js +98 -0
  590. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_zh-hans-mo.js +98 -0
  591. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_zh-hans-sg.js +98 -0
  592. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_zh-hans.js +98 -0
  593. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_zh-hant-hk.js +98 -0
  594. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_zh-hant-mo.js +98 -0
  595. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_zh-hant-tw.js +98 -0
  596. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_zh-hant.js +98 -0
  597. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_zh-hk.js +98 -0
  598. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_zh-tw.js +98 -0
  599. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_zh.js +98 -0
  600. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_zu-za.js +98 -0
  601. data/vendor/assets/javascripts/1.1.5/i18n/angular-locale_zu.js +98 -0
  602. data/vendor/assets/javascripts/angular-bootstrap-prettify.js +1835 -0
  603. data/vendor/assets/javascripts/angular-bootstrap.js +175 -0
  604. data/vendor/assets/javascripts/angular-cookies-unstable.js +185 -0
  605. data/vendor/assets/javascripts/angular-cookies.js +185 -0
  606. data/vendor/assets/javascripts/angular-loader-unstable.js +304 -0
  607. data/vendor/assets/javascripts/angular-loader.js +277 -0
  608. data/vendor/assets/javascripts/angular-mobile-unstable.js +460 -0
  609. data/vendor/assets/javascripts/angular-mocks-unstable.js +1886 -0
  610. data/vendor/assets/javascripts/angular-mocks.js +1788 -0
  611. data/vendor/assets/javascripts/angular-resource-unstable.js +25 -9
  612. data/vendor/assets/javascripts/angular-resource.js +1 -1
  613. data/vendor/assets/javascripts/angular-sanitize-unstable.js +1 -1
  614. data/vendor/assets/javascripts/angular-sanitize.js +1 -1
  615. data/vendor/assets/javascripts/angular-scenario-unstable.js +28463 -0
  616. data/vendor/assets/javascripts/angular-scenario.js +26310 -0
  617. data/vendor/assets/javascripts/angular-unstable.js +1229 -667
  618. data/vendor/assets/javascripts/angular.js +276 -189
  619. metadata +606 -2
@@ -0,0 +1,1886 @@
1
+ /**
2
+ * @license AngularJS v1.1.5
3
+ * (c) 2010-2012 Google, Inc. http://angularjs.org
4
+ * License: MIT
5
+ *
6
+ * TODO(vojta): wrap whole file into closure during build
7
+ */
8
+
9
+ /**
10
+ * @ngdoc overview
11
+ * @name angular.mock
12
+ * @description
13
+ *
14
+ * Namespace from 'angular-mocks.js' which contains testing related code.
15
+ */
16
+ angular.mock = {};
17
+
18
+ /**
19
+ * ! This is a private undocumented service !
20
+ *
21
+ * @name ngMock.$browser
22
+ *
23
+ * @description
24
+ * This service is a mock implementation of {@link ng.$browser}. It provides fake
25
+ * implementation for commonly used browser apis that are hard to test, e.g. setTimeout, xhr,
26
+ * cookies, etc...
27
+ *
28
+ * The api of this service is the same as that of the real {@link ng.$browser $browser}, except
29
+ * that there are several helper methods available which can be used in tests.
30
+ */
31
+ angular.mock.$BrowserProvider = function() {
32
+ this.$get = function(){
33
+ return new angular.mock.$Browser();
34
+ };
35
+ };
36
+
37
+ angular.mock.$Browser = function() {
38
+ var self = this;
39
+
40
+ this.isMock = true;
41
+ self.$$url = "http://server/";
42
+ self.$$lastUrl = self.$$url; // used by url polling fn
43
+ self.pollFns = [];
44
+
45
+ // TODO(vojta): remove this temporary api
46
+ self.$$completeOutstandingRequest = angular.noop;
47
+ self.$$incOutstandingRequestCount = angular.noop;
48
+
49
+
50
+ // register url polling fn
51
+
52
+ self.onUrlChange = function(listener) {
53
+ self.pollFns.push(
54
+ function() {
55
+ if (self.$$lastUrl != self.$$url) {
56
+ self.$$lastUrl = self.$$url;
57
+ listener(self.$$url);
58
+ }
59
+ }
60
+ );
61
+
62
+ return listener;
63
+ };
64
+
65
+ self.cookieHash = {};
66
+ self.lastCookieHash = {};
67
+ self.deferredFns = [];
68
+ self.deferredNextId = 0;
69
+
70
+ self.defer = function(fn, delay) {
71
+ delay = delay || 0;
72
+ self.deferredFns.push({time:(self.defer.now + delay), fn:fn, id: self.deferredNextId});
73
+ self.deferredFns.sort(function(a,b){ return a.time - b.time;});
74
+ return self.deferredNextId++;
75
+ };
76
+
77
+
78
+ self.defer.now = 0;
79
+
80
+
81
+ self.defer.cancel = function(deferId) {
82
+ var fnIndex;
83
+
84
+ angular.forEach(self.deferredFns, function(fn, index) {
85
+ if (fn.id === deferId) fnIndex = index;
86
+ });
87
+
88
+ if (fnIndex !== undefined) {
89
+ self.deferredFns.splice(fnIndex, 1);
90
+ return true;
91
+ }
92
+
93
+ return false;
94
+ };
95
+
96
+
97
+ /**
98
+ * @name ngMock.$browser#defer.flush
99
+ * @methodOf ngMock.$browser
100
+ *
101
+ * @description
102
+ * Flushes all pending requests and executes the defer callbacks.
103
+ *
104
+ * @param {number=} number of milliseconds to flush. See {@link #defer.now}
105
+ */
106
+ self.defer.flush = function(delay) {
107
+ if (angular.isDefined(delay)) {
108
+ self.defer.now += delay;
109
+ } else {
110
+ if (self.deferredFns.length) {
111
+ self.defer.now = self.deferredFns[self.deferredFns.length-1].time;
112
+ } else {
113
+ throw Error('No deferred tasks to be flushed');
114
+ }
115
+ }
116
+
117
+ while (self.deferredFns.length && self.deferredFns[0].time <= self.defer.now) {
118
+ self.deferredFns.shift().fn();
119
+ }
120
+ };
121
+ /**
122
+ * @name ngMock.$browser#defer.now
123
+ * @propertyOf ngMock.$browser
124
+ *
125
+ * @description
126
+ * Current milliseconds mock time.
127
+ */
128
+
129
+ self.$$baseHref = '';
130
+ self.baseHref = function() {
131
+ return this.$$baseHref;
132
+ };
133
+ };
134
+ angular.mock.$Browser.prototype = {
135
+
136
+ /**
137
+ * @name ngMock.$browser#poll
138
+ * @methodOf ngMock.$browser
139
+ *
140
+ * @description
141
+ * run all fns in pollFns
142
+ */
143
+ poll: function poll() {
144
+ angular.forEach(this.pollFns, function(pollFn){
145
+ pollFn();
146
+ });
147
+ },
148
+
149
+ addPollFn: function(pollFn) {
150
+ this.pollFns.push(pollFn);
151
+ return pollFn;
152
+ },
153
+
154
+ url: function(url, replace) {
155
+ if (url) {
156
+ this.$$url = url;
157
+ return this;
158
+ }
159
+
160
+ return this.$$url;
161
+ },
162
+
163
+ cookies: function(name, value) {
164
+ if (name) {
165
+ if (value == undefined) {
166
+ delete this.cookieHash[name];
167
+ } else {
168
+ if (angular.isString(value) && //strings only
169
+ value.length <= 4096) { //strict cookie storage limits
170
+ this.cookieHash[name] = value;
171
+ }
172
+ }
173
+ } else {
174
+ if (!angular.equals(this.cookieHash, this.lastCookieHash)) {
175
+ this.lastCookieHash = angular.copy(this.cookieHash);
176
+ this.cookieHash = angular.copy(this.cookieHash);
177
+ }
178
+ return this.cookieHash;
179
+ }
180
+ },
181
+
182
+ notifyWhenNoOutstandingRequests: function(fn) {
183
+ fn();
184
+ }
185
+ };
186
+
187
+
188
+ /**
189
+ * @ngdoc object
190
+ * @name ngMock.$exceptionHandlerProvider
191
+ *
192
+ * @description
193
+ * Configures the mock implementation of {@link ng.$exceptionHandler} to rethrow or to log errors passed
194
+ * into the `$exceptionHandler`.
195
+ */
196
+
197
+ /**
198
+ * @ngdoc object
199
+ * @name ngMock.$exceptionHandler
200
+ *
201
+ * @description
202
+ * Mock implementation of {@link ng.$exceptionHandler} that rethrows or logs errors passed
203
+ * into it. See {@link ngMock.$exceptionHandlerProvider $exceptionHandlerProvider} for configuration
204
+ * information.
205
+ *
206
+ *
207
+ * <pre>
208
+ * describe('$exceptionHandlerProvider', function() {
209
+ *
210
+ * it('should capture log messages and exceptions', function() {
211
+ *
212
+ * module(function($exceptionHandlerProvider) {
213
+ * $exceptionHandlerProvider.mode('log');
214
+ * });
215
+ *
216
+ * inject(function($log, $exceptionHandler, $timeout) {
217
+ * $timeout(function() { $log.log(1); });
218
+ * $timeout(function() { $log.log(2); throw 'banana peel'; });
219
+ * $timeout(function() { $log.log(3); });
220
+ * expect($exceptionHandler.errors).toEqual([]);
221
+ * expect($log.assertEmpty());
222
+ * $timeout.flush();
223
+ * expect($exceptionHandler.errors).toEqual(['banana peel']);
224
+ * expect($log.log.logs).toEqual([[1], [2], [3]]);
225
+ * });
226
+ * });
227
+ * });
228
+ * </pre>
229
+ */
230
+
231
+ angular.mock.$ExceptionHandlerProvider = function() {
232
+ var handler;
233
+
234
+ /**
235
+ * @ngdoc method
236
+ * @name ngMock.$exceptionHandlerProvider#mode
237
+ * @methodOf ngMock.$exceptionHandlerProvider
238
+ *
239
+ * @description
240
+ * Sets the logging mode.
241
+ *
242
+ * @param {string} mode Mode of operation, defaults to `rethrow`.
243
+ *
244
+ * - `rethrow`: If any errors are passed into the handler in tests, it typically
245
+ * means that there is a bug in the application or test, so this mock will
246
+ * make these tests fail.
247
+ * - `log`: Sometimes it is desirable to test that an error is thrown, for this case the `log` mode stores an
248
+ * array of errors in `$exceptionHandler.errors`, to allow later assertion of them.
249
+ * See {@link ngMock.$log#assertEmpty assertEmpty()} and
250
+ * {@link ngMock.$log#reset reset()}
251
+ */
252
+ this.mode = function(mode) {
253
+ switch(mode) {
254
+ case 'rethrow':
255
+ handler = function(e) {
256
+ throw e;
257
+ };
258
+ break;
259
+ case 'log':
260
+ var errors = [];
261
+
262
+ handler = function(e) {
263
+ if (arguments.length == 1) {
264
+ errors.push(e);
265
+ } else {
266
+ errors.push([].slice.call(arguments, 0));
267
+ }
268
+ };
269
+
270
+ handler.errors = errors;
271
+ break;
272
+ default:
273
+ throw Error("Unknown mode '" + mode + "', only 'log'/'rethrow' modes are allowed!");
274
+ }
275
+ };
276
+
277
+ this.$get = function() {
278
+ return handler;
279
+ };
280
+
281
+ this.mode('rethrow');
282
+ };
283
+
284
+
285
+ /**
286
+ * @ngdoc service
287
+ * @name ngMock.$log
288
+ *
289
+ * @description
290
+ * Mock implementation of {@link ng.$log} that gathers all logged messages in arrays
291
+ * (one array per logging level). These arrays are exposed as `logs` property of each of the
292
+ * level-specific log function, e.g. for level `error` the array is exposed as `$log.error.logs`.
293
+ *
294
+ */
295
+ angular.mock.$LogProvider = function() {
296
+
297
+ function concat(array1, array2, index) {
298
+ return array1.concat(Array.prototype.slice.call(array2, index));
299
+ }
300
+
301
+
302
+ this.$get = function () {
303
+ var $log = {
304
+ log: function() { $log.log.logs.push(concat([], arguments, 0)); },
305
+ warn: function() { $log.warn.logs.push(concat([], arguments, 0)); },
306
+ info: function() { $log.info.logs.push(concat([], arguments, 0)); },
307
+ error: function() { $log.error.logs.push(concat([], arguments, 0)); }
308
+ };
309
+
310
+ /**
311
+ * @ngdoc method
312
+ * @name ngMock.$log#reset
313
+ * @methodOf ngMock.$log
314
+ *
315
+ * @description
316
+ * Reset all of the logging arrays to empty.
317
+ */
318
+ $log.reset = function () {
319
+ /**
320
+ * @ngdoc property
321
+ * @name ngMock.$log#log.logs
322
+ * @propertyOf ngMock.$log
323
+ *
324
+ * @description
325
+ * Array of messages logged using {@link ngMock.$log#log}.
326
+ *
327
+ * @example
328
+ * <pre>
329
+ * $log.log('Some Log');
330
+ * var first = $log.log.logs.unshift();
331
+ * </pre>
332
+ */
333
+ $log.log.logs = [];
334
+ /**
335
+ * @ngdoc property
336
+ * @name ngMock.$log#warn.logs
337
+ * @propertyOf ngMock.$log
338
+ *
339
+ * @description
340
+ * Array of messages logged using {@link ngMock.$log#warn}.
341
+ *
342
+ * @example
343
+ * <pre>
344
+ * $log.warn('Some Warning');
345
+ * var first = $log.warn.logs.unshift();
346
+ * </pre>
347
+ */
348
+ $log.warn.logs = [];
349
+ /**
350
+ * @ngdoc property
351
+ * @name ngMock.$log#info.logs
352
+ * @propertyOf ngMock.$log
353
+ *
354
+ * @description
355
+ * Array of messages logged using {@link ngMock.$log#info}.
356
+ *
357
+ * @example
358
+ * <pre>
359
+ * $log.info('Some Info');
360
+ * var first = $log.info.logs.unshift();
361
+ * </pre>
362
+ */
363
+ $log.info.logs = [];
364
+ /**
365
+ * @ngdoc property
366
+ * @name ngMock.$log#error.logs
367
+ * @propertyOf ngMock.$log
368
+ *
369
+ * @description
370
+ * Array of messages logged using {@link ngMock.$log#error}.
371
+ *
372
+ * @example
373
+ * <pre>
374
+ * $log.log('Some Error');
375
+ * var first = $log.error.logs.unshift();
376
+ * </pre>
377
+ */
378
+ $log.error.logs = [];
379
+ };
380
+
381
+ /**
382
+ * @ngdoc method
383
+ * @name ngMock.$log#assertEmpty
384
+ * @methodOf ngMock.$log
385
+ *
386
+ * @description
387
+ * Assert that the all of the logging methods have no logged messages. If messages present, an exception is thrown.
388
+ */
389
+ $log.assertEmpty = function() {
390
+ var errors = [];
391
+ angular.forEach(['error', 'warn', 'info', 'log'], function(logLevel) {
392
+ angular.forEach($log[logLevel].logs, function(log) {
393
+ angular.forEach(log, function (logItem) {
394
+ errors.push('MOCK $log (' + logLevel + '): ' + String(logItem) + '\n' + (logItem.stack || ''));
395
+ });
396
+ });
397
+ });
398
+ if (errors.length) {
399
+ errors.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or an expected " +
400
+ "log message was not checked and removed:");
401
+ errors.push('');
402
+ throw new Error(errors.join('\n---------\n'));
403
+ }
404
+ };
405
+
406
+ $log.reset();
407
+ return $log;
408
+ };
409
+ };
410
+
411
+
412
+ (function() {
413
+ var R_ISO8061_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?:\:?(\d\d)(?:\:?(\d\d)(?:\.(\d{3}))?)?)?(Z|([+-])(\d\d):?(\d\d)))?$/;
414
+
415
+ function jsonStringToDate(string){
416
+ var match;
417
+ if (match = string.match(R_ISO8061_STR)) {
418
+ var date = new Date(0),
419
+ tzHour = 0,
420
+ tzMin = 0;
421
+ if (match[9]) {
422
+ tzHour = int(match[9] + match[10]);
423
+ tzMin = int(match[9] + match[11]);
424
+ }
425
+ date.setUTCFullYear(int(match[1]), int(match[2]) - 1, int(match[3]));
426
+ date.setUTCHours(int(match[4]||0) - tzHour, int(match[5]||0) - tzMin, int(match[6]||0), int(match[7]||0));
427
+ return date;
428
+ }
429
+ return string;
430
+ }
431
+
432
+ function int(str) {
433
+ return parseInt(str, 10);
434
+ }
435
+
436
+ function padNumber(num, digits, trim) {
437
+ var neg = '';
438
+ if (num < 0) {
439
+ neg = '-';
440
+ num = -num;
441
+ }
442
+ num = '' + num;
443
+ while(num.length < digits) num = '0' + num;
444
+ if (trim)
445
+ num = num.substr(num.length - digits);
446
+ return neg + num;
447
+ }
448
+
449
+
450
+ /**
451
+ * @ngdoc object
452
+ * @name angular.mock.TzDate
453
+ * @description
454
+ *
455
+ * *NOTE*: this is not an injectable instance, just a globally available mock class of `Date`.
456
+ *
457
+ * Mock of the Date type which has its timezone specified via constructor arg.
458
+ *
459
+ * The main purpose is to create Date-like instances with timezone fixed to the specified timezone
460
+ * offset, so that we can test code that depends on local timezone settings without dependency on
461
+ * the time zone settings of the machine where the code is running.
462
+ *
463
+ * @param {number} offset Offset of the *desired* timezone in hours (fractions will be honored)
464
+ * @param {(number|string)} timestamp Timestamp representing the desired time in *UTC*
465
+ *
466
+ * @example
467
+ * !!!! WARNING !!!!!
468
+ * This is not a complete Date object so only methods that were implemented can be called safely.
469
+ * To make matters worse, TzDate instances inherit stuff from Date via a prototype.
470
+ *
471
+ * We do our best to intercept calls to "unimplemented" methods, but since the list of methods is
472
+ * incomplete we might be missing some non-standard methods. This can result in errors like:
473
+ * "Date.prototype.foo called on incompatible Object".
474
+ *
475
+ * <pre>
476
+ * var newYearInBratislava = new TzDate(-1, '2009-12-31T23:00:00Z');
477
+ * newYearInBratislava.getTimezoneOffset() => -60;
478
+ * newYearInBratislava.getFullYear() => 2010;
479
+ * newYearInBratislava.getMonth() => 0;
480
+ * newYearInBratislava.getDate() => 1;
481
+ * newYearInBratislava.getHours() => 0;
482
+ * newYearInBratislava.getMinutes() => 0;
483
+ * newYearInBratislava.getSeconds() => 0;
484
+ * </pre>
485
+ *
486
+ */
487
+ angular.mock.TzDate = function (offset, timestamp) {
488
+ var self = new Date(0);
489
+ if (angular.isString(timestamp)) {
490
+ var tsStr = timestamp;
491
+
492
+ self.origDate = jsonStringToDate(timestamp);
493
+
494
+ timestamp = self.origDate.getTime();
495
+ if (isNaN(timestamp))
496
+ throw {
497
+ name: "Illegal Argument",
498
+ message: "Arg '" + tsStr + "' passed into TzDate constructor is not a valid date string"
499
+ };
500
+ } else {
501
+ self.origDate = new Date(timestamp);
502
+ }
503
+
504
+ var localOffset = new Date(timestamp).getTimezoneOffset();
505
+ self.offsetDiff = localOffset*60*1000 - offset*1000*60*60;
506
+ self.date = new Date(timestamp + self.offsetDiff);
507
+
508
+ self.getTime = function() {
509
+ return self.date.getTime() - self.offsetDiff;
510
+ };
511
+
512
+ self.toLocaleDateString = function() {
513
+ return self.date.toLocaleDateString();
514
+ };
515
+
516
+ self.getFullYear = function() {
517
+ return self.date.getFullYear();
518
+ };
519
+
520
+ self.getMonth = function() {
521
+ return self.date.getMonth();
522
+ };
523
+
524
+ self.getDate = function() {
525
+ return self.date.getDate();
526
+ };
527
+
528
+ self.getHours = function() {
529
+ return self.date.getHours();
530
+ };
531
+
532
+ self.getMinutes = function() {
533
+ return self.date.getMinutes();
534
+ };
535
+
536
+ self.getSeconds = function() {
537
+ return self.date.getSeconds();
538
+ };
539
+
540
+ self.getMilliseconds = function() {
541
+ return self.date.getMilliseconds();
542
+ };
543
+
544
+ self.getTimezoneOffset = function() {
545
+ return offset * 60;
546
+ };
547
+
548
+ self.getUTCFullYear = function() {
549
+ return self.origDate.getUTCFullYear();
550
+ };
551
+
552
+ self.getUTCMonth = function() {
553
+ return self.origDate.getUTCMonth();
554
+ };
555
+
556
+ self.getUTCDate = function() {
557
+ return self.origDate.getUTCDate();
558
+ };
559
+
560
+ self.getUTCHours = function() {
561
+ return self.origDate.getUTCHours();
562
+ };
563
+
564
+ self.getUTCMinutes = function() {
565
+ return self.origDate.getUTCMinutes();
566
+ };
567
+
568
+ self.getUTCSeconds = function() {
569
+ return self.origDate.getUTCSeconds();
570
+ };
571
+
572
+ self.getUTCMilliseconds = function() {
573
+ return self.origDate.getUTCMilliseconds();
574
+ };
575
+
576
+ self.getDay = function() {
577
+ return self.date.getDay();
578
+ };
579
+
580
+ // provide this method only on browsers that already have it
581
+ if (self.toISOString) {
582
+ self.toISOString = function() {
583
+ return padNumber(self.origDate.getUTCFullYear(), 4) + '-' +
584
+ padNumber(self.origDate.getUTCMonth() + 1, 2) + '-' +
585
+ padNumber(self.origDate.getUTCDate(), 2) + 'T' +
586
+ padNumber(self.origDate.getUTCHours(), 2) + ':' +
587
+ padNumber(self.origDate.getUTCMinutes(), 2) + ':' +
588
+ padNumber(self.origDate.getUTCSeconds(), 2) + '.' +
589
+ padNumber(self.origDate.getUTCMilliseconds(), 3) + 'Z'
590
+ }
591
+ }
592
+
593
+ //hide all methods not implemented in this mock that the Date prototype exposes
594
+ var unimplementedMethods = ['getUTCDay',
595
+ 'getYear', 'setDate', 'setFullYear', 'setHours', 'setMilliseconds',
596
+ 'setMinutes', 'setMonth', 'setSeconds', 'setTime', 'setUTCDate', 'setUTCFullYear',
597
+ 'setUTCHours', 'setUTCMilliseconds', 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds',
598
+ 'setYear', 'toDateString', 'toGMTString', 'toJSON', 'toLocaleFormat', 'toLocaleString',
599
+ 'toLocaleTimeString', 'toSource', 'toString', 'toTimeString', 'toUTCString', 'valueOf'];
600
+
601
+ angular.forEach(unimplementedMethods, function(methodName) {
602
+ self[methodName] = function() {
603
+ throw Error("Method '" + methodName + "' is not implemented in the TzDate mock");
604
+ };
605
+ });
606
+
607
+ return self;
608
+ };
609
+
610
+ //make "tzDateInstance instanceof Date" return true
611
+ angular.mock.TzDate.prototype = Date.prototype;
612
+ })();
613
+
614
+ /**
615
+ * @ngdoc function
616
+ * @name angular.mock.createMockWindow
617
+ * @description
618
+ *
619
+ * This function creates a mock window object useful for controlling access ot setTimeout, but mocking out
620
+ * sufficient window's properties to allow Angular to execute.
621
+ *
622
+ * @example
623
+ *
624
+ * <pre>
625
+ beforeEach(module(function($provide) {
626
+ $provide.value('$window', window = angular.mock.createMockWindow());
627
+ }));
628
+
629
+ it('should do something', inject(function($window) {
630
+ var val = null;
631
+ $window.setTimeout(function() { val = 123; }, 10);
632
+ expect(val).toEqual(null);
633
+ window.setTimeout.expect(10).process();
634
+ expect(val).toEqual(123);
635
+ });
636
+ * </pre>
637
+ *
638
+ */
639
+ angular.mock.createMockWindow = function() {
640
+ var mockWindow = {};
641
+ var setTimeoutQueue = [];
642
+
643
+ mockWindow.document = window.document;
644
+ mockWindow.getComputedStyle = angular.bind(window, window.getComputedStyle);
645
+ mockWindow.scrollTo = angular.bind(window, window.scrollTo);
646
+ mockWindow.navigator = window.navigator;
647
+ mockWindow.setTimeout = function(fn, delay) {
648
+ setTimeoutQueue.push({fn: fn, delay: delay});
649
+ };
650
+ mockWindow.setTimeout.queue = setTimeoutQueue;
651
+ mockWindow.setTimeout.expect = function(delay) {
652
+ if (setTimeoutQueue.length > 0) {
653
+ return {
654
+ process: function() {
655
+ var tick = setTimeoutQueue.shift();
656
+ expect(tick.delay).toEqual(delay);
657
+ tick.fn();
658
+ }
659
+ };
660
+ } else {
661
+ expect('SetTimoutQueue empty. Expecting delay of ').toEqual(delay);
662
+ }
663
+ };
664
+
665
+ return mockWindow;
666
+ };
667
+
668
+ /**
669
+ * @ngdoc function
670
+ * @name angular.mock.dump
671
+ * @description
672
+ *
673
+ * *NOTE*: this is not an injectable instance, just a globally available function.
674
+ *
675
+ * Method for serializing common angular objects (scope, elements, etc..) into strings, useful for debugging.
676
+ *
677
+ * This method is also available on window, where it can be used to display objects on debug console.
678
+ *
679
+ * @param {*} object - any object to turn into string.
680
+ * @return {string} a serialized string of the argument
681
+ */
682
+ angular.mock.dump = function(object) {
683
+ return serialize(object);
684
+
685
+ function serialize(object) {
686
+ var out;
687
+
688
+ if (angular.isElement(object)) {
689
+ object = angular.element(object);
690
+ out = angular.element('<div></div>');
691
+ angular.forEach(object, function(element) {
692
+ out.append(angular.element(element).clone());
693
+ });
694
+ out = out.html();
695
+ } else if (angular.isArray(object)) {
696
+ out = [];
697
+ angular.forEach(object, function(o) {
698
+ out.push(serialize(o));
699
+ });
700
+ out = '[ ' + out.join(', ') + ' ]';
701
+ } else if (angular.isObject(object)) {
702
+ if (angular.isFunction(object.$eval) && angular.isFunction(object.$apply)) {
703
+ out = serializeScope(object);
704
+ } else if (object instanceof Error) {
705
+ out = object.stack || ('' + object.name + ': ' + object.message);
706
+ } else {
707
+ out = angular.toJson(object, true);
708
+ }
709
+ } else {
710
+ out = String(object);
711
+ }
712
+
713
+ return out;
714
+ }
715
+
716
+ function serializeScope(scope, offset) {
717
+ offset = offset || ' ';
718
+ var log = [offset + 'Scope(' + scope.$id + '): {'];
719
+ for ( var key in scope ) {
720
+ if (scope.hasOwnProperty(key) && !key.match(/^(\$|this)/)) {
721
+ log.push(' ' + key + ': ' + angular.toJson(scope[key]));
722
+ }
723
+ }
724
+ var child = scope.$$childHead;
725
+ while(child) {
726
+ log.push(serializeScope(child, offset + ' '));
727
+ child = child.$$nextSibling;
728
+ }
729
+ log.push('}');
730
+ return log.join('\n' + offset);
731
+ }
732
+ };
733
+
734
+ /**
735
+ * @ngdoc object
736
+ * @name ngMock.$httpBackend
737
+ * @description
738
+ * Fake HTTP backend implementation suitable for unit testing applications that use the
739
+ * {@link ng.$http $http service}.
740
+ *
741
+ * *Note*: For fake HTTP backend implementation suitable for end-to-end testing or backend-less
742
+ * development please see {@link ngMockE2E.$httpBackend e2e $httpBackend mock}.
743
+ *
744
+ * During unit testing, we want our unit tests to run quickly and have no external dependencies so
745
+ * we don’t want to send {@link https://developer.mozilla.org/en/xmlhttprequest XHR} or
746
+ * {@link http://en.wikipedia.org/wiki/JSONP JSONP} requests to a real server. All we really need is
747
+ * to verify whether a certain request has been sent or not, or alternatively just let the
748
+ * application make requests, respond with pre-trained responses and assert that the end result is
749
+ * what we expect it to be.
750
+ *
751
+ * This mock implementation can be used to respond with static or dynamic responses via the
752
+ * `expect` and `when` apis and their shortcuts (`expectGET`, `whenPOST`, etc).
753
+ *
754
+ * When an Angular application needs some data from a server, it calls the $http service, which
755
+ * sends the request to a real server using $httpBackend service. With dependency injection, it is
756
+ * easy to inject $httpBackend mock (which has the same API as $httpBackend) and use it to verify
757
+ * the requests and respond with some testing data without sending a request to real server.
758
+ *
759
+ * There are two ways to specify what test data should be returned as http responses by the mock
760
+ * backend when the code under test makes http requests:
761
+ *
762
+ * - `$httpBackend.expect` - specifies a request expectation
763
+ * - `$httpBackend.when` - specifies a backend definition
764
+ *
765
+ *
766
+ * # Request Expectations vs Backend Definitions
767
+ *
768
+ * Request expectations provide a way to make assertions about requests made by the application and
769
+ * to define responses for those requests. The test will fail if the expected requests are not made
770
+ * or they are made in the wrong order.
771
+ *
772
+ * Backend definitions allow you to define a fake backend for your application which doesn't assert
773
+ * if a particular request was made or not, it just returns a trained response if a request is made.
774
+ * The test will pass whether or not the request gets made during testing.
775
+ *
776
+ *
777
+ * <table class="table">
778
+ * <tr><th width="220px"></th><th>Request expectations</th><th>Backend definitions</th></tr>
779
+ * <tr>
780
+ * <th>Syntax</th>
781
+ * <td>.expect(...).respond(...)</td>
782
+ * <td>.when(...).respond(...)</td>
783
+ * </tr>
784
+ * <tr>
785
+ * <th>Typical usage</th>
786
+ * <td>strict unit tests</td>
787
+ * <td>loose (black-box) unit testing</td>
788
+ * </tr>
789
+ * <tr>
790
+ * <th>Fulfills multiple requests</th>
791
+ * <td>NO</td>
792
+ * <td>YES</td>
793
+ * </tr>
794
+ * <tr>
795
+ * <th>Order of requests matters</th>
796
+ * <td>YES</td>
797
+ * <td>NO</td>
798
+ * </tr>
799
+ * <tr>
800
+ * <th>Request required</th>
801
+ * <td>YES</td>
802
+ * <td>NO</td>
803
+ * </tr>
804
+ * <tr>
805
+ * <th>Response required</th>
806
+ * <td>optional (see below)</td>
807
+ * <td>YES</td>
808
+ * </tr>
809
+ * </table>
810
+ *
811
+ * In cases where both backend definitions and request expectations are specified during unit
812
+ * testing, the request expectations are evaluated first.
813
+ *
814
+ * If a request expectation has no response specified, the algorithm will search your backend
815
+ * definitions for an appropriate response.
816
+ *
817
+ * If a request didn't match any expectation or if the expectation doesn't have the response
818
+ * defined, the backend definitions are evaluated in sequential order to see if any of them match
819
+ * the request. The response from the first matched definition is returned.
820
+ *
821
+ *
822
+ * # Flushing HTTP requests
823
+ *
824
+ * The $httpBackend used in production, always responds to requests with responses asynchronously.
825
+ * If we preserved this behavior in unit testing, we'd have to create async unit tests, which are
826
+ * hard to write, follow and maintain. At the same time the testing mock, can't respond
827
+ * synchronously because that would change the execution of the code under test. For this reason the
828
+ * mock $httpBackend has a `flush()` method, which allows the test to explicitly flush pending
829
+ * requests and thus preserving the async api of the backend, while allowing the test to execute
830
+ * synchronously.
831
+ *
832
+ *
833
+ * # Unit testing with mock $httpBackend
834
+ *
835
+ * <pre>
836
+ // controller
837
+ function MyController($scope, $http) {
838
+ $http.get('/auth.py').success(function(data) {
839
+ $scope.user = data;
840
+ });
841
+
842
+ this.saveMessage = function(message) {
843
+ $scope.status = 'Saving...';
844
+ $http.post('/add-msg.py', message).success(function(response) {
845
+ $scope.status = '';
846
+ }).error(function() {
847
+ $scope.status = 'ERROR!';
848
+ });
849
+ };
850
+ }
851
+
852
+ // testing controller
853
+ var $httpBackend;
854
+
855
+ beforeEach(inject(function($injector) {
856
+ $httpBackend = $injector.get('$httpBackend');
857
+
858
+ // backend definition common for all tests
859
+ $httpBackend.when('GET', '/auth.py').respond({userId: 'userX'}, {'A-Token': 'xxx'});
860
+ }));
861
+
862
+
863
+ afterEach(function() {
864
+ $httpBackend.verifyNoOutstandingExpectation();
865
+ $httpBackend.verifyNoOutstandingRequest();
866
+ });
867
+
868
+
869
+ it('should fetch authentication token', function() {
870
+ $httpBackend.expectGET('/auth.py');
871
+ var controller = scope.$new(MyController);
872
+ $httpBackend.flush();
873
+ });
874
+
875
+
876
+ it('should send msg to server', function() {
877
+ // now you don’t care about the authentication, but
878
+ // the controller will still send the request and
879
+ // $httpBackend will respond without you having to
880
+ // specify the expectation and response for this request
881
+ $httpBackend.expectPOST('/add-msg.py', 'message content').respond(201, '');
882
+
883
+ var controller = scope.$new(MyController);
884
+ $httpBackend.flush();
885
+ controller.saveMessage('message content');
886
+ expect(controller.status).toBe('Saving...');
887
+ $httpBackend.flush();
888
+ expect(controller.status).toBe('');
889
+ });
890
+
891
+
892
+ it('should send auth header', function() {
893
+ $httpBackend.expectPOST('/add-msg.py', undefined, function(headers) {
894
+ // check if the header was send, if it wasn't the expectation won't
895
+ // match the request and the test will fail
896
+ return headers['Authorization'] == 'xxx';
897
+ }).respond(201, '');
898
+
899
+ var controller = scope.$new(MyController);
900
+ controller.saveMessage('whatever');
901
+ $httpBackend.flush();
902
+ });
903
+ </pre>
904
+ */
905
+ angular.mock.$HttpBackendProvider = function() {
906
+ this.$get = ['$rootScope', createHttpBackendMock];
907
+ };
908
+
909
+ /**
910
+ * General factory function for $httpBackend mock.
911
+ * Returns instance for unit testing (when no arguments specified):
912
+ * - passing through is disabled
913
+ * - auto flushing is disabled
914
+ *
915
+ * Returns instance for e2e testing (when `$delegate` and `$browser` specified):
916
+ * - passing through (delegating request to real backend) is enabled
917
+ * - auto flushing is enabled
918
+ *
919
+ * @param {Object=} $delegate Real $httpBackend instance (allow passing through if specified)
920
+ * @param {Object=} $browser Auto-flushing enabled if specified
921
+ * @return {Object} Instance of $httpBackend mock
922
+ */
923
+ function createHttpBackendMock($rootScope, $delegate, $browser) {
924
+ var definitions = [],
925
+ expectations = [],
926
+ responses = [],
927
+ responsesPush = angular.bind(responses, responses.push);
928
+
929
+ function createResponse(status, data, headers) {
930
+ if (angular.isFunction(status)) return status;
931
+
932
+ return function() {
933
+ return angular.isNumber(status)
934
+ ? [status, data, headers]
935
+ : [200, status, data];
936
+ };
937
+ }
938
+
939
+ // TODO(vojta): change params to: method, url, data, headers, callback
940
+ function $httpBackend(method, url, data, callback, headers, timeout) {
941
+ var xhr = new MockXhr(),
942
+ expectation = expectations[0],
943
+ wasExpected = false;
944
+
945
+ function prettyPrint(data) {
946
+ return (angular.isString(data) || angular.isFunction(data) || data instanceof RegExp)
947
+ ? data
948
+ : angular.toJson(data);
949
+ }
950
+
951
+ function wrapResponse(wrapped) {
952
+ if (!$browser && timeout && timeout.then) timeout.then(handleTimeout);
953
+
954
+ return handleResponse;
955
+
956
+ function handleResponse() {
957
+ var response = wrapped.response(method, url, data, headers);
958
+ xhr.$$respHeaders = response[2];
959
+ callback(response[0], response[1], xhr.getAllResponseHeaders());
960
+ }
961
+
962
+ function handleTimeout() {
963
+ for (var i = 0, ii = responses.length; i < ii; i++) {
964
+ if (responses[i] === handleResponse) {
965
+ responses.splice(i, 1);
966
+ callback(-1, undefined, '');
967
+ break;
968
+ }
969
+ }
970
+ }
971
+ }
972
+
973
+ if (expectation && expectation.match(method, url)) {
974
+ if (!expectation.matchData(data))
975
+ throw Error('Expected ' + expectation + ' with different data\n' +
976
+ 'EXPECTED: ' + prettyPrint(expectation.data) + '\nGOT: ' + data);
977
+
978
+ if (!expectation.matchHeaders(headers))
979
+ throw Error('Expected ' + expectation + ' with different headers\n' +
980
+ 'EXPECTED: ' + prettyPrint(expectation.headers) + '\nGOT: ' +
981
+ prettyPrint(headers));
982
+
983
+ expectations.shift();
984
+
985
+ if (expectation.response) {
986
+ responses.push(wrapResponse(expectation));
987
+ return;
988
+ }
989
+ wasExpected = true;
990
+ }
991
+
992
+ var i = -1, definition;
993
+ while ((definition = definitions[++i])) {
994
+ if (definition.match(method, url, data, headers || {})) {
995
+ if (definition.response) {
996
+ // if $browser specified, we do auto flush all requests
997
+ ($browser ? $browser.defer : responsesPush)(wrapResponse(definition));
998
+ } else if (definition.passThrough) {
999
+ $delegate(method, url, data, callback, headers, timeout);
1000
+ } else throw Error('No response defined !');
1001
+ return;
1002
+ }
1003
+ }
1004
+ throw wasExpected ?
1005
+ Error('No response defined !') :
1006
+ Error('Unexpected request: ' + method + ' ' + url + '\n' +
1007
+ (expectation ? 'Expected ' + expectation : 'No more request expected'));
1008
+ }
1009
+
1010
+ /**
1011
+ * @ngdoc method
1012
+ * @name ngMock.$httpBackend#when
1013
+ * @methodOf ngMock.$httpBackend
1014
+ * @description
1015
+ * Creates a new backend definition.
1016
+ *
1017
+ * @param {string} method HTTP method.
1018
+ * @param {string|RegExp} url HTTP url.
1019
+ * @param {(string|RegExp)=} data HTTP request body.
1020
+ * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
1021
+ * object and returns true if the headers match the current definition.
1022
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
1023
+ * request is handled.
1024
+ *
1025
+ * - respond – `{function([status,] data[, headers])|function(function(method, url, data, headers)}`
1026
+ * – The respond method takes a set of static data to be returned or a function that can return
1027
+ * an array containing response status (number), response data (string) and response headers
1028
+ * (Object).
1029
+ */
1030
+ $httpBackend.when = function(method, url, data, headers) {
1031
+ var definition = new MockHttpExpectation(method, url, data, headers),
1032
+ chain = {
1033
+ respond: function(status, data, headers) {
1034
+ definition.response = createResponse(status, data, headers);
1035
+ }
1036
+ };
1037
+
1038
+ if ($browser) {
1039
+ chain.passThrough = function() {
1040
+ definition.passThrough = true;
1041
+ };
1042
+ }
1043
+
1044
+ definitions.push(definition);
1045
+ return chain;
1046
+ };
1047
+
1048
+ /**
1049
+ * @ngdoc method
1050
+ * @name ngMock.$httpBackend#whenGET
1051
+ * @methodOf ngMock.$httpBackend
1052
+ * @description
1053
+ * Creates a new backend definition for GET requests. For more info see `when()`.
1054
+ *
1055
+ * @param {string|RegExp} url HTTP url.
1056
+ * @param {(Object|function(Object))=} headers HTTP headers.
1057
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
1058
+ * request is handled.
1059
+ */
1060
+
1061
+ /**
1062
+ * @ngdoc method
1063
+ * @name ngMock.$httpBackend#whenHEAD
1064
+ * @methodOf ngMock.$httpBackend
1065
+ * @description
1066
+ * Creates a new backend definition for HEAD requests. For more info see `when()`.
1067
+ *
1068
+ * @param {string|RegExp} url HTTP url.
1069
+ * @param {(Object|function(Object))=} headers HTTP headers.
1070
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
1071
+ * request is handled.
1072
+ */
1073
+
1074
+ /**
1075
+ * @ngdoc method
1076
+ * @name ngMock.$httpBackend#whenDELETE
1077
+ * @methodOf ngMock.$httpBackend
1078
+ * @description
1079
+ * Creates a new backend definition for DELETE requests. For more info see `when()`.
1080
+ *
1081
+ * @param {string|RegExp} url HTTP url.
1082
+ * @param {(Object|function(Object))=} headers HTTP headers.
1083
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
1084
+ * request is handled.
1085
+ */
1086
+
1087
+ /**
1088
+ * @ngdoc method
1089
+ * @name ngMock.$httpBackend#whenPOST
1090
+ * @methodOf ngMock.$httpBackend
1091
+ * @description
1092
+ * Creates a new backend definition for POST requests. For more info see `when()`.
1093
+ *
1094
+ * @param {string|RegExp} url HTTP url.
1095
+ * @param {(string|RegExp)=} data HTTP request body.
1096
+ * @param {(Object|function(Object))=} headers HTTP headers.
1097
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
1098
+ * request is handled.
1099
+ */
1100
+
1101
+ /**
1102
+ * @ngdoc method
1103
+ * @name ngMock.$httpBackend#whenPUT
1104
+ * @methodOf ngMock.$httpBackend
1105
+ * @description
1106
+ * Creates a new backend definition for PUT requests. For more info see `when()`.
1107
+ *
1108
+ * @param {string|RegExp} url HTTP url.
1109
+ * @param {(string|RegExp)=} data HTTP request body.
1110
+ * @param {(Object|function(Object))=} headers HTTP headers.
1111
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
1112
+ * request is handled.
1113
+ */
1114
+
1115
+ /**
1116
+ * @ngdoc method
1117
+ * @name ngMock.$httpBackend#whenJSONP
1118
+ * @methodOf ngMock.$httpBackend
1119
+ * @description
1120
+ * Creates a new backend definition for JSONP requests. For more info see `when()`.
1121
+ *
1122
+ * @param {string|RegExp} url HTTP url.
1123
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
1124
+ * request is handled.
1125
+ */
1126
+ createShortMethods('when');
1127
+
1128
+
1129
+ /**
1130
+ * @ngdoc method
1131
+ * @name ngMock.$httpBackend#expect
1132
+ * @methodOf ngMock.$httpBackend
1133
+ * @description
1134
+ * Creates a new request expectation.
1135
+ *
1136
+ * @param {string} method HTTP method.
1137
+ * @param {string|RegExp} url HTTP url.
1138
+ * @param {(string|RegExp)=} data HTTP request body.
1139
+ * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
1140
+ * object and returns true if the headers match the current expectation.
1141
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
1142
+ * request is handled.
1143
+ *
1144
+ * - respond – `{function([status,] data[, headers])|function(function(method, url, data, headers)}`
1145
+ * – The respond method takes a set of static data to be returned or a function that can return
1146
+ * an array containing response status (number), response data (string) and response headers
1147
+ * (Object).
1148
+ */
1149
+ $httpBackend.expect = function(method, url, data, headers) {
1150
+ var expectation = new MockHttpExpectation(method, url, data, headers);
1151
+ expectations.push(expectation);
1152
+ return {
1153
+ respond: function(status, data, headers) {
1154
+ expectation.response = createResponse(status, data, headers);
1155
+ }
1156
+ };
1157
+ };
1158
+
1159
+
1160
+ /**
1161
+ * @ngdoc method
1162
+ * @name ngMock.$httpBackend#expectGET
1163
+ * @methodOf ngMock.$httpBackend
1164
+ * @description
1165
+ * Creates a new request expectation for GET requests. For more info see `expect()`.
1166
+ *
1167
+ * @param {string|RegExp} url HTTP url.
1168
+ * @param {Object=} headers HTTP headers.
1169
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
1170
+ * request is handled. See #expect for more info.
1171
+ */
1172
+
1173
+ /**
1174
+ * @ngdoc method
1175
+ * @name ngMock.$httpBackend#expectHEAD
1176
+ * @methodOf ngMock.$httpBackend
1177
+ * @description
1178
+ * Creates a new request expectation for HEAD requests. For more info see `expect()`.
1179
+ *
1180
+ * @param {string|RegExp} url HTTP url.
1181
+ * @param {Object=} headers HTTP headers.
1182
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
1183
+ * request is handled.
1184
+ */
1185
+
1186
+ /**
1187
+ * @ngdoc method
1188
+ * @name ngMock.$httpBackend#expectDELETE
1189
+ * @methodOf ngMock.$httpBackend
1190
+ * @description
1191
+ * Creates a new request expectation for DELETE requests. For more info see `expect()`.
1192
+ *
1193
+ * @param {string|RegExp} url HTTP url.
1194
+ * @param {Object=} headers HTTP headers.
1195
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
1196
+ * request is handled.
1197
+ */
1198
+
1199
+ /**
1200
+ * @ngdoc method
1201
+ * @name ngMock.$httpBackend#expectPOST
1202
+ * @methodOf ngMock.$httpBackend
1203
+ * @description
1204
+ * Creates a new request expectation for POST requests. For more info see `expect()`.
1205
+ *
1206
+ * @param {string|RegExp} url HTTP url.
1207
+ * @param {(string|RegExp)=} data HTTP request body.
1208
+ * @param {Object=} headers HTTP headers.
1209
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
1210
+ * request is handled.
1211
+ */
1212
+
1213
+ /**
1214
+ * @ngdoc method
1215
+ * @name ngMock.$httpBackend#expectPUT
1216
+ * @methodOf ngMock.$httpBackend
1217
+ * @description
1218
+ * Creates a new request expectation for PUT requests. For more info see `expect()`.
1219
+ *
1220
+ * @param {string|RegExp} url HTTP url.
1221
+ * @param {(string|RegExp)=} data HTTP request body.
1222
+ * @param {Object=} headers HTTP headers.
1223
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
1224
+ * request is handled.
1225
+ */
1226
+
1227
+ /**
1228
+ * @ngdoc method
1229
+ * @name ngMock.$httpBackend#expectPATCH
1230
+ * @methodOf ngMock.$httpBackend
1231
+ * @description
1232
+ * Creates a new request expectation for PATCH requests. For more info see `expect()`.
1233
+ *
1234
+ * @param {string|RegExp} url HTTP url.
1235
+ * @param {(string|RegExp)=} data HTTP request body.
1236
+ * @param {Object=} headers HTTP headers.
1237
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
1238
+ * request is handled.
1239
+ */
1240
+
1241
+ /**
1242
+ * @ngdoc method
1243
+ * @name ngMock.$httpBackend#expectJSONP
1244
+ * @methodOf ngMock.$httpBackend
1245
+ * @description
1246
+ * Creates a new request expectation for JSONP requests. For more info see `expect()`.
1247
+ *
1248
+ * @param {string|RegExp} url HTTP url.
1249
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
1250
+ * request is handled.
1251
+ */
1252
+ createShortMethods('expect');
1253
+
1254
+
1255
+ /**
1256
+ * @ngdoc method
1257
+ * @name ngMock.$httpBackend#flush
1258
+ * @methodOf ngMock.$httpBackend
1259
+ * @description
1260
+ * Flushes all pending requests using the trained responses.
1261
+ *
1262
+ * @param {number=} count Number of responses to flush (in the order they arrived). If undefined,
1263
+ * all pending requests will be flushed. If there are no pending requests when the flush method
1264
+ * is called an exception is thrown (as this typically a sign of programming error).
1265
+ */
1266
+ $httpBackend.flush = function(count) {
1267
+ $rootScope.$digest();
1268
+ if (!responses.length) throw Error('No pending request to flush !');
1269
+
1270
+ if (angular.isDefined(count)) {
1271
+ while (count--) {
1272
+ if (!responses.length) throw Error('No more pending request to flush !');
1273
+ responses.shift()();
1274
+ }
1275
+ } else {
1276
+ while (responses.length) {
1277
+ responses.shift()();
1278
+ }
1279
+ }
1280
+ $httpBackend.verifyNoOutstandingExpectation();
1281
+ };
1282
+
1283
+
1284
+ /**
1285
+ * @ngdoc method
1286
+ * @name ngMock.$httpBackend#verifyNoOutstandingExpectation
1287
+ * @methodOf ngMock.$httpBackend
1288
+ * @description
1289
+ * Verifies that all of the requests defined via the `expect` api were made. If any of the
1290
+ * requests were not made, verifyNoOutstandingExpectation throws an exception.
1291
+ *
1292
+ * Typically, you would call this method following each test case that asserts requests using an
1293
+ * "afterEach" clause.
1294
+ *
1295
+ * <pre>
1296
+ * afterEach($httpBackend.verifyExpectations);
1297
+ * </pre>
1298
+ */
1299
+ $httpBackend.verifyNoOutstandingExpectation = function() {
1300
+ $rootScope.$digest();
1301
+ if (expectations.length) {
1302
+ throw Error('Unsatisfied requests: ' + expectations.join(', '));
1303
+ }
1304
+ };
1305
+
1306
+
1307
+ /**
1308
+ * @ngdoc method
1309
+ * @name ngMock.$httpBackend#verifyNoOutstandingRequest
1310
+ * @methodOf ngMock.$httpBackend
1311
+ * @description
1312
+ * Verifies that there are no outstanding requests that need to be flushed.
1313
+ *
1314
+ * Typically, you would call this method following each test case that asserts requests using an
1315
+ * "afterEach" clause.
1316
+ *
1317
+ * <pre>
1318
+ * afterEach($httpBackend.verifyNoOutstandingRequest);
1319
+ * </pre>
1320
+ */
1321
+ $httpBackend.verifyNoOutstandingRequest = function() {
1322
+ if (responses.length) {
1323
+ throw Error('Unflushed requests: ' + responses.length);
1324
+ }
1325
+ };
1326
+
1327
+
1328
+ /**
1329
+ * @ngdoc method
1330
+ * @name ngMock.$httpBackend#resetExpectations
1331
+ * @methodOf ngMock.$httpBackend
1332
+ * @description
1333
+ * Resets all request expectations, but preserves all backend definitions. Typically, you would
1334
+ * call resetExpectations during a multiple-phase test when you want to reuse the same instance of
1335
+ * $httpBackend mock.
1336
+ */
1337
+ $httpBackend.resetExpectations = function() {
1338
+ expectations.length = 0;
1339
+ responses.length = 0;
1340
+ };
1341
+
1342
+ return $httpBackend;
1343
+
1344
+
1345
+ function createShortMethods(prefix) {
1346
+ angular.forEach(['GET', 'DELETE', 'JSONP'], function(method) {
1347
+ $httpBackend[prefix + method] = function(url, headers) {
1348
+ return $httpBackend[prefix](method, url, undefined, headers)
1349
+ }
1350
+ });
1351
+
1352
+ angular.forEach(['PUT', 'POST', 'PATCH'], function(method) {
1353
+ $httpBackend[prefix + method] = function(url, data, headers) {
1354
+ return $httpBackend[prefix](method, url, data, headers)
1355
+ }
1356
+ });
1357
+ }
1358
+ }
1359
+
1360
+ function MockHttpExpectation(method, url, data, headers) {
1361
+
1362
+ this.data = data;
1363
+ this.headers = headers;
1364
+
1365
+ this.match = function(m, u, d, h) {
1366
+ if (method != m) return false;
1367
+ if (!this.matchUrl(u)) return false;
1368
+ if (angular.isDefined(d) && !this.matchData(d)) return false;
1369
+ if (angular.isDefined(h) && !this.matchHeaders(h)) return false;
1370
+ return true;
1371
+ };
1372
+
1373
+ this.matchUrl = function(u) {
1374
+ if (!url) return true;
1375
+ if (angular.isFunction(url.test)) return url.test(u);
1376
+ return url == u;
1377
+ };
1378
+
1379
+ this.matchHeaders = function(h) {
1380
+ if (angular.isUndefined(headers)) return true;
1381
+ if (angular.isFunction(headers)) return headers(h);
1382
+ return angular.equals(headers, h);
1383
+ };
1384
+
1385
+ this.matchData = function(d) {
1386
+ if (angular.isUndefined(data)) return true;
1387
+ if (data && angular.isFunction(data.test)) return data.test(d);
1388
+ if (data && !angular.isString(data)) return angular.toJson(data) == d;
1389
+ return data == d;
1390
+ };
1391
+
1392
+ this.toString = function() {
1393
+ return method + ' ' + url;
1394
+ };
1395
+ }
1396
+
1397
+ function MockXhr() {
1398
+
1399
+ // hack for testing $http, $httpBackend
1400
+ MockXhr.$$lastInstance = this;
1401
+
1402
+ this.open = function(method, url, async) {
1403
+ this.$$method = method;
1404
+ this.$$url = url;
1405
+ this.$$async = async;
1406
+ this.$$reqHeaders = {};
1407
+ this.$$respHeaders = {};
1408
+ };
1409
+
1410
+ this.send = function(data) {
1411
+ this.$$data = data;
1412
+ };
1413
+
1414
+ this.setRequestHeader = function(key, value) {
1415
+ this.$$reqHeaders[key] = value;
1416
+ };
1417
+
1418
+ this.getResponseHeader = function(name) {
1419
+ // the lookup must be case insensitive, that's why we try two quick lookups and full scan at last
1420
+ var header = this.$$respHeaders[name];
1421
+ if (header) return header;
1422
+
1423
+ name = angular.lowercase(name);
1424
+ header = this.$$respHeaders[name];
1425
+ if (header) return header;
1426
+
1427
+ header = undefined;
1428
+ angular.forEach(this.$$respHeaders, function(headerVal, headerName) {
1429
+ if (!header && angular.lowercase(headerName) == name) header = headerVal;
1430
+ });
1431
+ return header;
1432
+ };
1433
+
1434
+ this.getAllResponseHeaders = function() {
1435
+ var lines = [];
1436
+
1437
+ angular.forEach(this.$$respHeaders, function(value, key) {
1438
+ lines.push(key + ': ' + value);
1439
+ });
1440
+ return lines.join('\n');
1441
+ };
1442
+
1443
+ this.abort = angular.noop;
1444
+ }
1445
+
1446
+
1447
+ /**
1448
+ * @ngdoc function
1449
+ * @name ngMock.$timeout
1450
+ * @description
1451
+ *
1452
+ * This service is just a simple decorator for {@link ng.$timeout $timeout} service
1453
+ * that adds a "flush" and "verifyNoPendingTasks" methods.
1454
+ */
1455
+
1456
+ angular.mock.$TimeoutDecorator = function($delegate, $browser) {
1457
+
1458
+ /**
1459
+ * @ngdoc method
1460
+ * @name ngMock.$timeout#flush
1461
+ * @methodOf ngMock.$timeout
1462
+ * @description
1463
+ *
1464
+ * Flushes the queue of pending tasks.
1465
+ */
1466
+ $delegate.flush = function() {
1467
+ $browser.defer.flush();
1468
+ };
1469
+
1470
+ /**
1471
+ * @ngdoc method
1472
+ * @name ngMock.$timeout#verifyNoPendingTasks
1473
+ * @methodOf ngMock.$timeout
1474
+ * @description
1475
+ *
1476
+ * Verifies that there are no pending tasks that need to be flushed.
1477
+ */
1478
+ $delegate.verifyNoPendingTasks = function() {
1479
+ if ($browser.deferredFns.length) {
1480
+ throw Error('Deferred tasks to flush (' + $browser.deferredFns.length + '): ' +
1481
+ formatPendingTasksAsString($browser.deferredFns));
1482
+ }
1483
+ };
1484
+
1485
+ function formatPendingTasksAsString(tasks) {
1486
+ var result = [];
1487
+ angular.forEach(tasks, function(task) {
1488
+ result.push('{id: ' + task.id + ', ' + 'time: ' + task.time + '}');
1489
+ });
1490
+
1491
+ return result.join(', ');
1492
+ }
1493
+
1494
+ return $delegate;
1495
+ };
1496
+
1497
+ /**
1498
+ *
1499
+ */
1500
+ angular.mock.$RootElementProvider = function() {
1501
+ this.$get = function() {
1502
+ return angular.element('<div ng-app></div>');
1503
+ }
1504
+ };
1505
+
1506
+ /**
1507
+ * @ngdoc overview
1508
+ * @name ngMock
1509
+ * @description
1510
+ *
1511
+ * The `ngMock` is an angular module which is used with `ng` module and adds unit-test configuration as well as useful
1512
+ * mocks to the {@link AUTO.$injector $injector}.
1513
+ */
1514
+ angular.module('ngMock', ['ng']).provider({
1515
+ $browser: angular.mock.$BrowserProvider,
1516
+ $exceptionHandler: angular.mock.$ExceptionHandlerProvider,
1517
+ $log: angular.mock.$LogProvider,
1518
+ $httpBackend: angular.mock.$HttpBackendProvider,
1519
+ $rootElement: angular.mock.$RootElementProvider
1520
+ }).config(function($provide) {
1521
+ $provide.decorator('$timeout', angular.mock.$TimeoutDecorator);
1522
+ });
1523
+
1524
+ /**
1525
+ * @ngdoc overview
1526
+ * @name ngMockE2E
1527
+ * @description
1528
+ *
1529
+ * The `ngMockE2E` is an angular module which contains mocks suitable for end-to-end testing.
1530
+ * Currently there is only one mock present in this module -
1531
+ * the {@link ngMockE2E.$httpBackend e2e $httpBackend} mock.
1532
+ */
1533
+ angular.module('ngMockE2E', ['ng']).config(function($provide) {
1534
+ $provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator);
1535
+ });
1536
+
1537
+ /**
1538
+ * @ngdoc object
1539
+ * @name ngMockE2E.$httpBackend
1540
+ * @description
1541
+ * Fake HTTP backend implementation suitable for end-to-end testing or backend-less development of
1542
+ * applications that use the {@link ng.$http $http service}.
1543
+ *
1544
+ * *Note*: For fake http backend implementation suitable for unit testing please see
1545
+ * {@link ngMock.$httpBackend unit-testing $httpBackend mock}.
1546
+ *
1547
+ * This implementation can be used to respond with static or dynamic responses via the `when` api
1548
+ * and its shortcuts (`whenGET`, `whenPOST`, etc) and optionally pass through requests to the
1549
+ * real $httpBackend for specific requests (e.g. to interact with certain remote apis or to fetch
1550
+ * templates from a webserver).
1551
+ *
1552
+ * As opposed to unit-testing, in an end-to-end testing scenario or in scenario when an application
1553
+ * is being developed with the real backend api replaced with a mock, it is often desirable for
1554
+ * certain category of requests to bypass the mock and issue a real http request (e.g. to fetch
1555
+ * templates or static files from the webserver). To configure the backend with this behavior
1556
+ * use the `passThrough` request handler of `when` instead of `respond`.
1557
+ *
1558
+ * Additionally, we don't want to manually have to flush mocked out requests like we do during unit
1559
+ * testing. For this reason the e2e $httpBackend automatically flushes mocked out requests
1560
+ * automatically, closely simulating the behavior of the XMLHttpRequest object.
1561
+ *
1562
+ * To setup the application to run with this http backend, you have to create a module that depends
1563
+ * on the `ngMockE2E` and your application modules and defines the fake backend:
1564
+ *
1565
+ * <pre>
1566
+ * myAppDev = angular.module('myAppDev', ['myApp', 'ngMockE2E']);
1567
+ * myAppDev.run(function($httpBackend) {
1568
+ * phones = [{name: 'phone1'}, {name: 'phone2'}];
1569
+ *
1570
+ * // returns the current list of phones
1571
+ * $httpBackend.whenGET('/phones').respond(phones);
1572
+ *
1573
+ * // adds a new phone to the phones array
1574
+ * $httpBackend.whenPOST('/phones').respond(function(method, url, data) {
1575
+ * phones.push(angular.fromJSON(data));
1576
+ * });
1577
+ * $httpBackend.whenGET(/^\/templates\//).passThrough();
1578
+ * //...
1579
+ * });
1580
+ * </pre>
1581
+ *
1582
+ * Afterwards, bootstrap your app with this new module.
1583
+ */
1584
+
1585
+ /**
1586
+ * @ngdoc method
1587
+ * @name ngMockE2E.$httpBackend#when
1588
+ * @methodOf ngMockE2E.$httpBackend
1589
+ * @description
1590
+ * Creates a new backend definition.
1591
+ *
1592
+ * @param {string} method HTTP method.
1593
+ * @param {string|RegExp} url HTTP url.
1594
+ * @param {(string|RegExp)=} data HTTP request body.
1595
+ * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
1596
+ * object and returns true if the headers match the current definition.
1597
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
1598
+ * control how a matched request is handled.
1599
+ *
1600
+ * - respond – `{function([status,] data[, headers])|function(function(method, url, data, headers)}`
1601
+ * – The respond method takes a set of static data to be returned or a function that can return
1602
+ * an array containing response status (number), response data (string) and response headers
1603
+ * (Object).
1604
+ * - passThrough – `{function()}` – Any request matching a backend definition with `passThrough`
1605
+ * handler, will be pass through to the real backend (an XHR request will be made to the
1606
+ * server.
1607
+ */
1608
+
1609
+ /**
1610
+ * @ngdoc method
1611
+ * @name ngMockE2E.$httpBackend#whenGET
1612
+ * @methodOf ngMockE2E.$httpBackend
1613
+ * @description
1614
+ * Creates a new backend definition for GET requests. For more info see `when()`.
1615
+ *
1616
+ * @param {string|RegExp} url HTTP url.
1617
+ * @param {(Object|function(Object))=} headers HTTP headers.
1618
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
1619
+ * control how a matched request is handled.
1620
+ */
1621
+
1622
+ /**
1623
+ * @ngdoc method
1624
+ * @name ngMockE2E.$httpBackend#whenHEAD
1625
+ * @methodOf ngMockE2E.$httpBackend
1626
+ * @description
1627
+ * Creates a new backend definition for HEAD requests. For more info see `when()`.
1628
+ *
1629
+ * @param {string|RegExp} url HTTP url.
1630
+ * @param {(Object|function(Object))=} headers HTTP headers.
1631
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
1632
+ * control how a matched request is handled.
1633
+ */
1634
+
1635
+ /**
1636
+ * @ngdoc method
1637
+ * @name ngMockE2E.$httpBackend#whenDELETE
1638
+ * @methodOf ngMockE2E.$httpBackend
1639
+ * @description
1640
+ * Creates a new backend definition for DELETE requests. For more info see `when()`.
1641
+ *
1642
+ * @param {string|RegExp} url HTTP url.
1643
+ * @param {(Object|function(Object))=} headers HTTP headers.
1644
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
1645
+ * control how a matched request is handled.
1646
+ */
1647
+
1648
+ /**
1649
+ * @ngdoc method
1650
+ * @name ngMockE2E.$httpBackend#whenPOST
1651
+ * @methodOf ngMockE2E.$httpBackend
1652
+ * @description
1653
+ * Creates a new backend definition for POST requests. For more info see `when()`.
1654
+ *
1655
+ * @param {string|RegExp} url HTTP url.
1656
+ * @param {(string|RegExp)=} data HTTP request body.
1657
+ * @param {(Object|function(Object))=} headers HTTP headers.
1658
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
1659
+ * control how a matched request is handled.
1660
+ */
1661
+
1662
+ /**
1663
+ * @ngdoc method
1664
+ * @name ngMockE2E.$httpBackend#whenPUT
1665
+ * @methodOf ngMockE2E.$httpBackend
1666
+ * @description
1667
+ * Creates a new backend definition for PUT requests. For more info see `when()`.
1668
+ *
1669
+ * @param {string|RegExp} url HTTP url.
1670
+ * @param {(string|RegExp)=} data HTTP request body.
1671
+ * @param {(Object|function(Object))=} headers HTTP headers.
1672
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
1673
+ * control how a matched request is handled.
1674
+ */
1675
+
1676
+ /**
1677
+ * @ngdoc method
1678
+ * @name ngMockE2E.$httpBackend#whenPATCH
1679
+ * @methodOf ngMockE2E.$httpBackend
1680
+ * @description
1681
+ * Creates a new backend definition for PATCH requests. For more info see `when()`.
1682
+ *
1683
+ * @param {string|RegExp} url HTTP url.
1684
+ * @param {(string|RegExp)=} data HTTP request body.
1685
+ * @param {(Object|function(Object))=} headers HTTP headers.
1686
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
1687
+ * control how a matched request is handled.
1688
+ */
1689
+
1690
+ /**
1691
+ * @ngdoc method
1692
+ * @name ngMockE2E.$httpBackend#whenJSONP
1693
+ * @methodOf ngMockE2E.$httpBackend
1694
+ * @description
1695
+ * Creates a new backend definition for JSONP requests. For more info see `when()`.
1696
+ *
1697
+ * @param {string|RegExp} url HTTP url.
1698
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
1699
+ * control how a matched request is handled.
1700
+ */
1701
+ angular.mock.e2e = {};
1702
+ angular.mock.e2e.$httpBackendDecorator = ['$rootScope', '$delegate', '$browser', createHttpBackendMock];
1703
+
1704
+
1705
+ angular.mock.clearDataCache = function() {
1706
+ var key,
1707
+ cache = angular.element.cache;
1708
+
1709
+ for(key in cache) {
1710
+ if (cache.hasOwnProperty(key)) {
1711
+ var handle = cache[key].handle;
1712
+
1713
+ handle && angular.element(handle.elem).unbind();
1714
+ delete cache[key];
1715
+ }
1716
+ }
1717
+ };
1718
+
1719
+
1720
+ window.jstestdriver && (function(window) {
1721
+ /**
1722
+ * Global method to output any number of objects into JSTD console. Useful for debugging.
1723
+ */
1724
+ window.dump = function() {
1725
+ var args = [];
1726
+ angular.forEach(arguments, function(arg) {
1727
+ args.push(angular.mock.dump(arg));
1728
+ });
1729
+ jstestdriver.console.log.apply(jstestdriver.console, args);
1730
+ if (window.console) {
1731
+ window.console.log.apply(window.console, args);
1732
+ }
1733
+ };
1734
+ })(window);
1735
+
1736
+
1737
+ (window.jasmine || window.mocha) && (function(window) {
1738
+
1739
+ var currentSpec = null;
1740
+
1741
+ beforeEach(function() {
1742
+ currentSpec = this;
1743
+ });
1744
+
1745
+ afterEach(function() {
1746
+ var injector = currentSpec.$injector;
1747
+
1748
+ currentSpec.$injector = null;
1749
+ currentSpec.$modules = null;
1750
+ currentSpec = null;
1751
+
1752
+ if (injector) {
1753
+ injector.get('$rootElement').unbind();
1754
+ injector.get('$browser').pollFns.length = 0;
1755
+ }
1756
+
1757
+ angular.mock.clearDataCache();
1758
+
1759
+ // clean up jquery's fragment cache
1760
+ angular.forEach(angular.element.fragments, function(val, key) {
1761
+ delete angular.element.fragments[key];
1762
+ });
1763
+
1764
+ MockXhr.$$lastInstance = null;
1765
+
1766
+ angular.forEach(angular.callbacks, function(val, key) {
1767
+ delete angular.callbacks[key];
1768
+ });
1769
+ angular.callbacks.counter = 0;
1770
+ });
1771
+
1772
+ function isSpecRunning() {
1773
+ return currentSpec && (window.mocha || currentSpec.queue.running);
1774
+ }
1775
+
1776
+ /**
1777
+ * @ngdoc function
1778
+ * @name angular.mock.module
1779
+ * @description
1780
+ *
1781
+ * *NOTE*: This function is also published on window for easy access.<br>
1782
+ *
1783
+ * This function registers a module configuration code. It collects the configuration information
1784
+ * which will be used when the injector is created by {@link angular.mock.inject inject}.
1785
+ *
1786
+ * See {@link angular.mock.inject inject} for usage example
1787
+ *
1788
+ * @param {...(string|Function)} fns any number of modules which are represented as string
1789
+ * aliases or as anonymous module initialization functions. The modules are used to
1790
+ * configure the injector. The 'ng' and 'ngMock' modules are automatically loaded.
1791
+ */
1792
+ window.module = angular.mock.module = function() {
1793
+ var moduleFns = Array.prototype.slice.call(arguments, 0);
1794
+ return isSpecRunning() ? workFn() : workFn;
1795
+ /////////////////////
1796
+ function workFn() {
1797
+ if (currentSpec.$injector) {
1798
+ throw Error('Injector already created, can not register a module!');
1799
+ } else {
1800
+ var modules = currentSpec.$modules || (currentSpec.$modules = []);
1801
+ angular.forEach(moduleFns, function(module) {
1802
+ modules.push(module);
1803
+ });
1804
+ }
1805
+ }
1806
+ };
1807
+
1808
+ /**
1809
+ * @ngdoc function
1810
+ * @name angular.mock.inject
1811
+ * @description
1812
+ *
1813
+ * *NOTE*: This function is also published on window for easy access.<br>
1814
+ *
1815
+ * The inject function wraps a function into an injectable function. The inject() creates new
1816
+ * instance of {@link AUTO.$injector $injector} per test, which is then used for
1817
+ * resolving references.
1818
+ *
1819
+ * See also {@link angular.mock.module module}
1820
+ *
1821
+ * Example of what a typical jasmine tests looks like with the inject method.
1822
+ * <pre>
1823
+ *
1824
+ * angular.module('myApplicationModule', [])
1825
+ * .value('mode', 'app')
1826
+ * .value('version', 'v1.0.1');
1827
+ *
1828
+ *
1829
+ * describe('MyApp', function() {
1830
+ *
1831
+ * // You need to load modules that you want to test,
1832
+ * // it loads only the "ng" module by default.
1833
+ * beforeEach(module('myApplicationModule'));
1834
+ *
1835
+ *
1836
+ * // inject() is used to inject arguments of all given functions
1837
+ * it('should provide a version', inject(function(mode, version) {
1838
+ * expect(version).toEqual('v1.0.1');
1839
+ * expect(mode).toEqual('app');
1840
+ * }));
1841
+ *
1842
+ *
1843
+ * // The inject and module method can also be used inside of the it or beforeEach
1844
+ * it('should override a version and test the new version is injected', function() {
1845
+ * // module() takes functions or strings (module aliases)
1846
+ * module(function($provide) {
1847
+ * $provide.value('version', 'overridden'); // override version here
1848
+ * });
1849
+ *
1850
+ * inject(function(version) {
1851
+ * expect(version).toEqual('overridden');
1852
+ * });
1853
+ * ));
1854
+ * });
1855
+ *
1856
+ * </pre>
1857
+ *
1858
+ * @param {...Function} fns any number of functions which will be injected using the injector.
1859
+ */
1860
+ window.inject = angular.mock.inject = function() {
1861
+ var blockFns = Array.prototype.slice.call(arguments, 0);
1862
+ var errorForStack = new Error('Declaration Location');
1863
+ return isSpecRunning() ? workFn() : workFn;
1864
+ /////////////////////
1865
+ function workFn() {
1866
+ var modules = currentSpec.$modules || [];
1867
+
1868
+ modules.unshift('ngMock');
1869
+ modules.unshift('ng');
1870
+ var injector = currentSpec.$injector;
1871
+ if (!injector) {
1872
+ injector = currentSpec.$injector = angular.injector(modules);
1873
+ }
1874
+ for(var i = 0, ii = blockFns.length; i < ii; i++) {
1875
+ try {
1876
+ injector.invoke(blockFns[i] || angular.noop, this);
1877
+ } catch (e) {
1878
+ if(e.stack && errorForStack) e.stack += '\n' + errorForStack.stack;
1879
+ throw e;
1880
+ } finally {
1881
+ errorForStack = null;
1882
+ }
1883
+ }
1884
+ }
1885
+ };
1886
+ })(window);