1
0

doc_test.rb 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. require 'test_helper'
  2. require 'docs'
  3. class DocsDocTest < MiniTest::Spec
  4. let :doc do
  5. Class.new Docs::Doc do
  6. self.name = 'name'
  7. self.type = 'type'
  8. end
  9. end
  10. let :page do
  11. { path: 'path', store_path: 'store_path', output: 'output', entries: [entry] }
  12. end
  13. let :entry do
  14. Docs::Entry.new
  15. end
  16. let :store do
  17. Docs::NullStore.new
  18. end
  19. describe ".inherited" do
  20. it "sets .type" do
  21. assert_equal doc.type, Class.new(doc).type
  22. end
  23. end
  24. describe ".name" do
  25. it "returns 'Doc' when the class is Docs::Doc" do
  26. assert_equal 'Doc', Docs::Doc.name
  27. end
  28. end
  29. describe ".name=" do
  30. it "stores .name" do
  31. doc.name = 'test'
  32. assert_equal 'test', doc.name
  33. end
  34. end
  35. describe ".slug" do
  36. it "returns 'doc' when the class is Docs::Doc" do
  37. assert_equal 'doc', Docs::Doc.slug
  38. end
  39. end
  40. describe ".slug=" do
  41. it "stores .slug" do
  42. doc.slug = 'test'
  43. assert_equal 'test', doc.slug
  44. end
  45. end
  46. describe ".release=" do
  47. it "stores .release" do
  48. doc.release = '1'
  49. assert_equal '1', doc.release
  50. end
  51. end
  52. describe ".links=" do
  53. it "stores .links" do
  54. doc.links = { test: true }
  55. assert_equal({ test: true }, doc.links)
  56. end
  57. end
  58. describe ".abstract" do
  59. it "returns nil" do
  60. assert_nil doc.abstract
  61. end
  62. end
  63. describe ".abstract=" do
  64. it "stores .abstract" do
  65. doc.abstract = true
  66. assert doc.abstract
  67. end
  68. end
  69. describe ".path" do
  70. it "returns .slug" do
  71. doc.slug = 'slug'
  72. assert_equal 'slug', doc.path
  73. end
  74. end
  75. describe ".index_path" do
  76. it "returns .path + ::INDEX_FILENAME" do
  77. stub(doc).path { 'path' }
  78. assert_equal File.join('path', Docs::Doc::INDEX_FILENAME), doc.index_path
  79. end
  80. end
  81. describe ".db_path" do
  82. it "returns .path + ::DB_FILENAME" do
  83. stub(doc).path { 'path' }
  84. assert_equal File.join('path', Docs::Doc::DB_FILENAME), doc.db_path
  85. end
  86. end
  87. describe ".new" do
  88. it "raises an error when .abstract is true" do
  89. doc.abstract = true
  90. assert_raises NotImplementedError do
  91. doc.new
  92. end
  93. end
  94. end
  95. describe ".as_json" do
  96. it "returns a hash" do
  97. assert_instance_of Hash, doc.as_json
  98. end
  99. it "includes the doc's name, slug, type, and release" do
  100. assert_equal %i(name slug type), doc.as_json.keys
  101. %w(name slug type release links).each do |attribute|
  102. eval "stub(doc).#{attribute} { attribute }"
  103. assert_equal attribute, doc.as_json[attribute.to_sym]
  104. end
  105. end
  106. end
  107. describe ".store_page" do
  108. it "builds a page" do
  109. any_instance_of(doc) do |instance|
  110. stub(instance).build_page('id') { @called = true; nil }
  111. end
  112. doc.store_page(store, 'id') {}
  113. assert @called
  114. end
  115. context "when the page builds successfully" do
  116. before do
  117. any_instance_of(doc) do |instance|
  118. stub(instance).build_page { page }
  119. end
  120. end
  121. context "and it has :entries" do
  122. it "returns true" do
  123. assert doc.store_page(store, 'id')
  124. end
  125. it "stores a file" do
  126. mock(store).write(page[:store_path], page[:output])
  127. doc.store_page(store, 'id')
  128. end
  129. it "opens the .path directory before storing the file" do
  130. stub(doc).path { 'path' }
  131. stub(store).write { assert false }
  132. mock(store).open('path') do |_, block|
  133. stub(store).write
  134. block.call
  135. end
  136. doc.store_page(store, 'id')
  137. end
  138. end
  139. context "and it doesn't have :entries" do
  140. before do
  141. page[:entries] = []
  142. end
  143. it "returns false" do
  144. refute doc.store_page(store, 'id')
  145. end
  146. it "doesn't store a file" do
  147. dont_allow(store).write
  148. doc.store_page(store, 'id')
  149. end
  150. end
  151. end
  152. context "when the page doesn't build successfully" do
  153. before do
  154. any_instance_of(doc) do |instance|
  155. stub(instance).build_page { nil }
  156. end
  157. end
  158. it "returns false" do
  159. refute doc.store_page(store, 'id')
  160. end
  161. it "doesn't store a file" do
  162. dont_allow(store).write
  163. doc.store_page(store, 'id')
  164. end
  165. end
  166. end
  167. describe ".store_pages" do
  168. it "build the pages" do
  169. any_instance_of(doc) do |instance|
  170. stub(instance).build_pages { @called = true }
  171. end
  172. doc.store_pages(store) {}
  173. assert @called
  174. end
  175. context "when pages are built successfully" do
  176. let :pages do
  177. [
  178. page.deep_dup.tap { |p| page[:entries].first.tap { |e| e.name = 'one' } },
  179. page.deep_dup.tap { |p| page[:entries].first.tap { |e| e.name = 'two' } }
  180. ]
  181. end
  182. before do
  183. any_instance_of(doc) do |instance|
  184. stub(instance).build_pages { |block| pages.each(&block) }
  185. end
  186. end
  187. context "and at least one page has :entries" do
  188. it "returns true" do
  189. assert doc.store_pages(store)
  190. end
  191. it "stores a file for each page that has :entries" do
  192. pages.first.merge!(entries: [], output: '')
  193. mock(store).write(page[:store_path], page[:output])
  194. mock(store).write('index.json', anything)
  195. mock(store).write('db.json', anything)
  196. doc.store_pages(store)
  197. end
  198. it "stores an index that contains all the pages' entries" do
  199. stub(store).write(page[:store_path], page[:output])
  200. stub(store).write('db.json', anything)
  201. mock(store).write('index.json', anything) do |path, json|
  202. json = JSON.parse(json)
  203. assert_equal pages.length, json['entries'].length
  204. assert_includes json['entries'], Docs::Entry.new('one').as_json.stringify_keys
  205. end
  206. doc.store_pages(store)
  207. end
  208. it "stores a db that contains all the pages, indexed by path" do
  209. stub(store).write(page[:store_path], page[:output])
  210. stub(store).write('index.json', anything)
  211. mock(store).write('db.json', anything) do |path, json|
  212. json = JSON.parse(json)
  213. assert_equal page[:output], json[page[:path]]
  214. end
  215. doc.store_pages(store)
  216. end
  217. it "replaces the .path directory before storing the files" do
  218. stub(doc).path { 'path' }
  219. stub(store).write { assert false }
  220. mock(store).replace('path') do |_, block|
  221. stub(store).write
  222. block.call
  223. end
  224. doc.store_pages(store)
  225. end
  226. end
  227. context "and no pages have :entries" do
  228. before do
  229. pages.each { |page| page[:entries] = [] }
  230. end
  231. it "returns false" do
  232. refute doc.store_pages(store)
  233. end
  234. it "doesn't store files" do
  235. dont_allow(store).write
  236. doc.store_pages(store)
  237. end
  238. end
  239. end
  240. context "when no pages are built successfully" do
  241. before do
  242. any_instance_of(doc) do |instance|
  243. stub(instance).build_pages
  244. end
  245. end
  246. it "returns false" do
  247. refute doc.store_pages(store)
  248. end
  249. it "doesn't store files" do
  250. dont_allow(store).write
  251. doc.store_pages(store)
  252. end
  253. end
  254. end
  255. end