getImageExtracts.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. 'use strict'
  2. import test from 'ava'
  3. import request from 'supertest'
  4. import fs from 'fs-extra'
  5. import path from 'path'
  6. import { apiPrefix, imageServedUrl, imagesPath } from '../../config'
  7. import { json, beforeEachTests } from './_test_functions'
  8. // ROUTE /getImageExtracts
  9. // Before each tests, start a server
  10. test.beforeEach(beforeEachTests)
  11. test('GET /getImageExtracts', async t => {
  12. const res = await request(t.context.server)
  13. .get(`${apiPrefix}/getImageExtracts`)
  14. t.is(res.status, 400, json(res))
  15. t.true(res.body.message.includes('Missing parameter'), json(res.body))
  16. t.true(res.body.message.includes('sceneName'), json(res.body))
  17. t.true(res.body.message.includes('imageQuality'), json(res.body))
  18. t.true(res.body.message.includes('horizontalExtractCount'), json(res.body))
  19. t.true(res.body.message.includes('verticalExtractCount'), json(res.body))
  20. })
  21. test('GET /getImageExtracts?sceneName=/../&imageQuality=a&horizontalExtractCount=a&verticalExtractCount=a', async t => {
  22. const res = await request(t.context.server)
  23. .get(`${apiPrefix}/getImageExtracts?sceneName=/../&imageQuality=a&horizontalExtractCount=a&verticalExtractCount=a`)
  24. t.is(res.status, 400, json(res))
  25. t.true(res.body.message.includes('Invalid query parameter'), json(res.body))
  26. t.truthy(res.body.data.find(x => x.match(/The requested scene name.*is not valid/)), json(res.body))
  27. t.truthy(res.body.data.find(x => x.includes('The specified quality is not an integer')), json(res.body))
  28. t.truthy(res.body.data.find(x => x.includes('horizontal axis is not an integer')), json(res.body))
  29. t.truthy(res.body.data.find(x => x.includes('vertical axis is not an integer')), json(res.body))
  30. })
  31. test('GET /getImageExtracts?sceneName=unknown-scene-name&imageQuality=10&horizontalExtractCount=5&verticalExtractCount=2', async t => {
  32. const res = await request(t.context.server)
  33. .get(`${apiPrefix}/getImageExtracts?sceneName=unknown-scene-name&imageQuality=10&horizontalExtractCount=5&verticalExtractCount=2`)
  34. t.is(res.status, 500, json(res))
  35. t.truthy(res.body.message.match(/Can't access.*scene dir.*Check it exist.*and you have read permission/), json(res.body))
  36. })
  37. test('GET /getImageExtracts?sceneName=bathroom&imageQuality=99999&horizontalExtractCount=5&verticalExtractCount=2', async t => {
  38. const res = await request(t.context.server)
  39. .get(`${apiPrefix}/getImageExtracts?sceneName=bathroom&imageQuality=99999&horizontalExtractCount=5&verticalExtractCount=2`)
  40. t.is(res.status, 404, json(res))
  41. t.truthy(res.body.message.match(/requested quality.*not found for.*scene/), json(res.body))
  42. })
  43. test('GET /getImageExtracts?sceneName=bathroom&imageQuality=10&horizontalExtractCount=0&verticalExtractCount=9999', async t => {
  44. const res = await request(t.context.server)
  45. .get(`${apiPrefix}/getImageExtracts?sceneName=bathroom&imageQuality=10&horizontalExtractCount=0&verticalExtractCount=9999`)
  46. t.is(res.status, 400, json(res))
  47. t.true(res.body.message.includes('Invalid query parameter'), json(res.body))
  48. t.truthy(res.body.data.find(x => x.includes('Incompatible number of horizontal extracts')), json(res.body))
  49. t.truthy(res.body.data.find(x => x.includes('Incompatible number of vertical extracts')), json(res.body))
  50. })
  51. test.serial('GET /getImageExtracts?sceneName=bathroom&imageQuality=10&horizontalExtractCount=5&verticalExtractCount=2', async t => {
  52. const res = await request(t.context.server)
  53. .get(`${apiPrefix}/getImageExtracts?sceneName=bathroom&imageQuality=10&horizontalExtractCount=5&verticalExtractCount=2`)
  54. t.is(res.status, 200, json(res))
  55. t.true(Array.isArray(res.body.data), json(res.body))
  56. t.is(res.body.data[0], `${imageServedUrl}/bathroom/extracts/x5_y2/zone00001/bathroom_zone00001_10.png`, json(res.body))
  57. // Check link is accessible and is an image
  58. const res2 = await request(t.context.server)
  59. .get(`${imageServedUrl}/bathroom/extracts/x5_y2/zone00001/bathroom_zone00001_10.png`)
  60. t.is(res2.status, 200, json(res2))
  61. t.is(res2.header['content-type'], 'image/png', json(res2))
  62. })
  63. test.serial('Extracts were successfully generated', async t => {
  64. // Check the extract on the file system
  65. const extracts = path.resolve(imagesPath, 'bathroom', 'extracts')
  66. const aBathroomConfig = path.resolve(extracts, 'x5_y2')
  67. const aBathroomConfigZone = path.resolve(aBathroomConfig, 'zone00001')
  68. const aBathroomConfigZoneImg = path.resolve(aBathroomConfigZone, 'bathroom_zone00001_10.png')
  69. const fsp = fs.promises
  70. // Check `bathroom/extracts`
  71. t.true(await fs.pathExists(extracts))
  72. t.deepEqual(await fsp.readdir(extracts), ['x5_y2'])
  73. // Check `bathroom/extracts/x5_y2`
  74. t.true(await fs.pathExists(aBathroomConfig), aBathroomConfig)
  75. t.is((await fsp.readdir(aBathroomConfig)).length, 10)
  76. // Check `bathroom/extracts/x5_y2/zone00001`
  77. t.true(await fs.pathExists(aBathroomConfigZone))
  78. t.is((await fsp.readdir(aBathroomConfigZone)).length, 1)
  79. // Check `bathroom/extracts/x5_y2/zone00001/bathroom_zone00001_10.png`
  80. t.true(await fs.pathExists(aBathroomConfigZoneImg))
  81. })