popup-options.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. var t = require('assert')
  2. module.exports = ({browser, popup, advanced, content}) => {
  3. before(async () => {
  4. // add origin
  5. await advanced.bringToFront()
  6. await advanced.select('.m-select', 'http')
  7. await advanced.type('[type=text]', 'localhost:3000')
  8. await advanced.click('button')
  9. await advanced.waitFor(() => document.querySelectorAll('.m-list li').length === 2)
  10. // enable header detection
  11. if (!await advanced.evaluate(() => state.header)) {
  12. await advanced.click('.m-switch')
  13. }
  14. })
  15. describe('button - raw/markdown', () => {
  16. before(async () => {
  17. // popup
  18. await popup.bringToFront()
  19. // defaults button
  20. await popup.click('button:nth-of-type(2)')
  21. })
  22. it('render markdown as html', async () => {
  23. // go to page serving markdown as text/markdown
  24. await content.goto('http://localhost:3000/correct-content-type')
  25. await content.bringToFront()
  26. await content.waitFor('#_html')
  27. t.equal(
  28. await content.evaluate(() =>
  29. document.querySelector('#_html p strong').innerText
  30. ),
  31. 'bold',
  32. 'markdown should be rendered'
  33. )
  34. // popup
  35. await popup.bringToFront()
  36. t.strictEqual(
  37. await popup.evaluate(() =>
  38. state.raw
  39. ),
  40. false,
  41. 'state.raw should equal false'
  42. )
  43. t.equal(
  44. await popup.evaluate(() =>
  45. document.querySelector('.m-button:first-child').innerText.toLowerCase()
  46. ),
  47. 'markdown',
  48. 'button text should equal markdown'
  49. )
  50. })
  51. it('display raw markdown', async () => {
  52. // raw button
  53. await content.bringToFront()
  54. await popup.click('button:nth-of-type(1)')
  55. // content auto reloads
  56. await content.waitFor('#_markdown')
  57. t.equal(
  58. await content.evaluate(() =>
  59. document.querySelector('#_markdown').innerText
  60. ),
  61. '**bold**',
  62. 'markdown should not be rendered'
  63. )
  64. // popup
  65. await popup.bringToFront()
  66. t.strictEqual(
  67. await popup.evaluate(() =>
  68. state.raw
  69. ),
  70. true,
  71. 'state.raw should equal true'
  72. )
  73. t.equal(
  74. await popup.evaluate(() =>
  75. document.querySelector('.m-button:first-child').innerText.toLowerCase()
  76. ),
  77. 'html',
  78. 'button text should equal html'
  79. )
  80. })
  81. })
  82. describe('set theme', () => {
  83. before(async () => {
  84. // popup
  85. await popup.bringToFront()
  86. // defaults button
  87. await popup.click('button:nth-of-type(2)')
  88. // theme tab
  89. await popup.click('.m-tabs a:nth-of-type(1)')
  90. })
  91. it('github theme should be set by default', async () => {
  92. // go to page serving markdown as text/markdown
  93. await content.goto('http://localhost:3000/correct-content-type')
  94. await content.bringToFront()
  95. await content.waitFor('#_theme')
  96. t.strictEqual(
  97. await content.evaluate(() =>
  98. /github\.css$/.test(
  99. document.querySelector('#_theme').getAttribute('href')
  100. )
  101. ),
  102. true,
  103. 'github theme styles should be included'
  104. )
  105. })
  106. it('set github-dark theme', async () => {
  107. // select github-dark theme
  108. await content.bringToFront()
  109. await popup.select('.m-panel:nth-of-type(1) select', 'github-dark')
  110. // content auto reloads
  111. await content.waitFor('#_theme')
  112. t.strictEqual(
  113. await content.evaluate(() =>
  114. /github-dark\.css$/.test(
  115. document.querySelector('#_theme').getAttribute('href')
  116. )
  117. ),
  118. true,
  119. 'github-dark theme styles should be included'
  120. )
  121. })
  122. it('popup should preserve state', async () => {
  123. // reload popup
  124. await popup.bringToFront()
  125. await popup.reload()
  126. await popup.waitFor('#popup')
  127. t.equal(
  128. await popup.evaluate(() =>
  129. state.theme
  130. ),
  131. 'github-dark',
  132. 'state.theme should equal github-dark'
  133. )
  134. t.equal(
  135. await popup.evaluate(() =>
  136. document.querySelectorAll('.m-panel:nth-of-type(1) select option')[
  137. document.querySelector('.m-panel:nth-of-type(1) select').selectedIndex
  138. ].innerText
  139. ),
  140. 'github-dark',
  141. 'dom select option should be github-dark'
  142. )
  143. })
  144. })
  145. describe('set compiler options - marked', () => {
  146. before(async () => {
  147. // popup
  148. await popup.bringToFront()
  149. // defaults button
  150. await popup.click('button:nth-of-type(2)')
  151. // compiler tab
  152. await popup.click('.m-tabs a:nth-of-type(2)')
  153. })
  154. it('gfm is enabled by default', async () => {
  155. // go to page serving markdown as text/markdown
  156. await content.goto('http://localhost:3000/compiler-options-marked')
  157. await content.bringToFront()
  158. await content.waitFor('#_html')
  159. t.equal(
  160. await content.evaluate(() =>
  161. document.querySelector('#_html p del').innerText
  162. ),
  163. 'strikethrough',
  164. 'gfm should be rendered'
  165. )
  166. })
  167. it('gfm is disabled', async () => {
  168. // disable gfm
  169. await content.bringToFront()
  170. // gfm switch
  171. await popup.click('.m-panel:nth-of-type(2) .m-switch:nth-of-type(2)')
  172. // content auto reloads
  173. await content.waitFor(100)
  174. await content.waitFor('#_html')
  175. t.equal(
  176. await content.evaluate(() =>
  177. document.querySelector('#_html p').innerText
  178. ),
  179. '~~strikethrough~~',
  180. 'gfm should not be rendered'
  181. )
  182. })
  183. it('popup should preserve state', async () => {
  184. // reload popup
  185. await popup.bringToFront()
  186. await popup.reload()
  187. await popup.waitFor('#popup')
  188. t.equal(
  189. await popup.evaluate(() =>
  190. document.querySelectorAll('.m-panel:nth-of-type(2) .m-select option')[
  191. document.querySelector('.m-panel:nth-of-type(2) .m-select').selectedIndex
  192. ].innerText
  193. ),
  194. 'marked',
  195. 'dom select option should be marked'
  196. )
  197. t.strictEqual(
  198. await popup.evaluate(() =>
  199. state.options.gfm
  200. ),
  201. false,
  202. 'state.options.gfm should be false'
  203. )
  204. t.strictEqual(
  205. await popup.evaluate(() =>
  206. document.querySelector('.m-panel:nth-of-type(2) .m-switch:nth-of-type(2)')
  207. .classList.contains('is-checked')
  208. ),
  209. false,
  210. 'dom gfm checkbox should be disabled'
  211. )
  212. })
  213. })
  214. describe('set compiler options - remark', () => {
  215. before(async () => {
  216. // popup
  217. await popup.bringToFront()
  218. // defaults button
  219. await popup.click('button:nth-of-type(2)')
  220. // compiler tab
  221. await popup.click('.m-tabs a:nth-of-type(2)')
  222. })
  223. it('marked should not render gfm task lists', async () => {
  224. // go to page serving markdown as text/markdown
  225. await content.goto('http://localhost:3000/compiler-options-remark')
  226. await content.bringToFront()
  227. await content.waitFor('#_html')
  228. t.equal(
  229. await content.evaluate(() =>
  230. document.querySelector('#_html ul li').innerText
  231. ),
  232. '[ ] task',
  233. 'gfm task lists should not be rendered'
  234. )
  235. })
  236. it('remark should render gfm task lists by default', async () => {
  237. // select remark compiler
  238. await content.bringToFront()
  239. await popup.select('.m-panel:nth-of-type(2) select', 'remark')
  240. // content auto reloads
  241. await content.waitFor(100)
  242. await content.waitFor('#_html')
  243. t.equal(
  244. await content.evaluate(() =>
  245. document.querySelector('#_html ul li').getAttribute('class')
  246. ),
  247. 'task-list-item',
  248. 'dom li should have a class set'
  249. )
  250. t.strictEqual(
  251. await content.evaluate(() =>
  252. document.querySelector('#_html ul li [type=checkbox]')
  253. .hasAttribute('disabled')
  254. ),
  255. true,
  256. 'dom li should contain checkbox in it'
  257. )
  258. t.equal(
  259. await content.evaluate(() =>
  260. document.querySelector('#_html ul li').innerText
  261. ),
  262. ' task',
  263. 'dom li should contain the task text'
  264. )
  265. })
  266. it('remark disable gfm', async () => {
  267. // redraw popup
  268. await popup.bringToFront()
  269. await popup.reload()
  270. await popup.waitFor('#popup')
  271. // disable gfm
  272. await content.bringToFront()
  273. // gfm switch
  274. await popup.click('.m-panel:nth-of-type(2) .m-switch:nth-of-type(4)')
  275. // content auto reloads
  276. await content.waitFor(100)
  277. await content.waitFor('#_html')
  278. t.equal(
  279. await content.evaluate(() =>
  280. document.querySelector('#_html ul li').innerText
  281. ),
  282. '[ ] task',
  283. 'gfm task lists should not be rendered'
  284. )
  285. })
  286. it('popup should preserve state', async () => {
  287. // reload popup
  288. await popup.bringToFront()
  289. await popup.reload()
  290. await popup.waitFor('#popup')
  291. await popup.waitFor(100)
  292. t.equal(
  293. await popup.evaluate(() =>
  294. document.querySelectorAll('.m-panel:nth-of-type(2) .m-select option')[
  295. document.querySelector('.m-panel:nth-of-type(2) .m-select').selectedIndex
  296. ].innerText
  297. ),
  298. 'remark',
  299. 'dom select option should be remark'
  300. )
  301. t.strictEqual(
  302. await popup.evaluate(() =>
  303. state.options.gfm
  304. ),
  305. false,
  306. 'state.options.gfm should be false'
  307. )
  308. t.strictEqual(
  309. await popup.evaluate(() =>
  310. document.querySelector('.m-panel:nth-of-type(2) .m-switch:nth-of-type(4)')
  311. .classList.contains('is-checked')
  312. ),
  313. false,
  314. 'dom gfm checkbox should be disabled'
  315. )
  316. })
  317. })
  318. describe('set content options - toc', () => {
  319. before(async () => {
  320. // popup
  321. await popup.bringToFront()
  322. // defaults button
  323. await popup.click('button:nth-of-type(2)')
  324. // content tab
  325. await popup.click('.m-tabs a:nth-of-type(3)')
  326. })
  327. it('toc is disabled by default', async () => {
  328. // go to page serving markdown as text/markdown
  329. await content.goto('http://localhost:3000/content-options-toc')
  330. await content.bringToFront()
  331. await content.waitFor('#_html')
  332. t.strictEqual(
  333. await content.evaluate(() =>
  334. document.querySelector('#_toc')
  335. ),
  336. null,
  337. 'toc should be disabled'
  338. )
  339. })
  340. it('enable toc', async () => {
  341. // enable toc
  342. await content.bringToFront()
  343. // toc switch
  344. await popup.click('.m-panel:nth-of-type(3) .m-switch:nth-of-type(3)')
  345. // content auto reloads
  346. await content.waitFor('#_toc')
  347. t.deepStrictEqual(
  348. await content.evaluate(() =>
  349. Array.from(document.querySelectorAll('#_toc #_ul a'))
  350. .map((a) => ({href: a.getAttribute('href'), text: a.innerText}))
  351. ),
  352. [
  353. {href: '#h1', text: 'h1'},
  354. {href: '#h2', text: 'h2'},
  355. {href: '#h3', text: 'h3'},
  356. ],
  357. 'toc should be rendered'
  358. )
  359. })
  360. })
  361. describe('set content options - scroll', () => {
  362. before(async () => {
  363. // popup
  364. await popup.bringToFront()
  365. // defaults button
  366. await popup.click('button:nth-of-type(2)')
  367. // content tab
  368. await popup.click('.m-tabs a:nth-of-type(3)')
  369. })
  370. it('preserve scroll position by default', async () => {
  371. // go to page serving markdown as text/markdown
  372. await content.goto('http://localhost:3000/content-options-scroll')
  373. await content.bringToFront()
  374. await content.waitFor('#_html')
  375. // scroll down 200px
  376. await content.evaluate(() =>
  377. document.querySelector('body').scrollTop = 200
  378. )
  379. await content.waitFor(150)
  380. // reload page
  381. await content.reload()
  382. await content.waitFor('#_html')
  383. await content.waitFor(150)
  384. t.strictEqual(
  385. await content.evaluate(() =>
  386. document.querySelector('body').scrollTop,
  387. ),
  388. 200,
  389. 'scrollTop should be 200px'
  390. )
  391. })
  392. it('scroll to top', async () => {
  393. // disable scroll option
  394. await content.bringToFront()
  395. // scroll switch
  396. await popup.click('.m-panel:nth-of-type(3) .m-switch:nth-of-type(2)')
  397. // content auto reloads
  398. await content.waitFor(100)
  399. await content.waitFor('#_html')
  400. t.strictEqual(
  401. await content.evaluate(() =>
  402. document.querySelector('body').scrollTop,
  403. ),
  404. 0,
  405. 'scrollTop should be 0px'
  406. )
  407. // scroll down 200px
  408. await content.evaluate(() =>
  409. document.querySelector('body').scrollTop = 200
  410. )
  411. await content.waitFor(150)
  412. // reload page
  413. await content.reload()
  414. await content.waitFor('#_html')
  415. await content.waitFor(150)
  416. t.strictEqual(
  417. await content.evaluate(() =>
  418. document.querySelector('body').scrollTop,
  419. ),
  420. 0,
  421. 'scrollTop should be 0px'
  422. )
  423. })
  424. it('scroll to anchor', async () => {
  425. // click on header link
  426. await content.click('h2 a')
  427. await content.waitFor(150)
  428. t.strictEqual(
  429. await content.evaluate(() =>
  430. document.querySelector('body').scrollTop + 2
  431. ),
  432. await content.evaluate(() =>
  433. document.querySelector('h2').offsetTop
  434. ),
  435. 'page should be scrolled to the anchor'
  436. )
  437. // scroll down 200px
  438. await content.evaluate(() =>
  439. document.querySelector('body').scrollTop += 200
  440. )
  441. await content.waitFor(150)
  442. t.strictEqual(
  443. await content.evaluate(() =>
  444. document.querySelector('body').scrollTop + 2
  445. ),
  446. await content.evaluate(() =>
  447. document.querySelector('h2').offsetTop + 200
  448. ),
  449. 'page should be scrolled below the anchor'
  450. )
  451. // reload page
  452. await content.reload()
  453. await content.waitFor('#_html')
  454. await content.waitFor(150)
  455. t.strictEqual(
  456. await content.evaluate(() =>
  457. document.querySelector('body').scrollTop
  458. ),
  459. await content.evaluate(() =>
  460. document.querySelector('h2').offsetTop
  461. ),
  462. 'page should be scrolled back to the anchor'
  463. )
  464. })
  465. })
  466. }