app_test.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. import os
  2. import time
  3. import pytest
  4. import uuid
  5. from app import app
  6. def createFile(name, size):
  7. # create a file of random data
  8. with open(name, 'wb') as fout:
  9. fout.write(os.urandom(size)) # replace 1024 with size_kb if not unreasonably large
  10. @pytest.fixture
  11. def client():
  12. app.config['TESTING'] = True
  13. # create fake pre-gen terrain files if they don't exist
  14. #preGen = ['S35E149.DAT', 'S35E147.DAT', 'S30E137.DAT', 'S31E136.DAT', 'S31E137.DAT', 'S31E138.DAT',
  15. # 'S30E136.DAT', 'S30E137.DAT', 'S30E138.DAT', 'S29E136.DAT', 'S29E137.DAT', 'S29E138.DAT']
  16. #for fileSingle in preGen:
  17. # full = os.path.join(os.getcwd(), "processedTerrain", fileSingle)
  18. # print(full)
  19. # if not os.path.exists(full):
  20. # print("Making fake file: " + full)
  21. # createFile(full, 1024 * 1024)
  22. with app.test_client() as client:
  23. yield client
  24. def test_homepage(client):
  25. """Test that the homepage can be generated"""
  26. rv = client.get('/')
  27. # assert all the controls are there
  28. assert b'<title>AP Terrain Generator</title>' in rv.data
  29. assert b'<form action="/generate" method="post">' in rv.data
  30. assert b'<input type="text" id="lat" name="lat" value="-35.363261">' in rv.data
  31. assert b'<input type="text" id="long" name="long" value="149.165230">' in rv.data
  32. assert b'<input type="number" id="radius" name="radius" value="100" min="1" max="400">' in rv.data
  33. assert b'<input type="submit" value="Submit" method="post">' in rv.data
  34. def test_badinput(client):
  35. """Test bad inputs"""
  36. # no input
  37. rv = client.post('/generate', data=dict(
  38. ), follow_redirects=True)
  39. assert b'<title>AP Terrain Generator</title>' in rv.data
  40. assert b'Error' in rv.data
  41. assert b'Link To Download' not in rv.data
  42. #partial input
  43. rv = client.post('/generate', data=dict(
  44. lat='-35.363261',
  45. long='149.165230',
  46. ), follow_redirects=True)
  47. assert b'<title>AP Terrain Generator</title>' in rv.data
  48. assert b'Error' in rv.data
  49. assert b'Link To Download' not in rv.data
  50. #bad lon/lat
  51. rv = client.post('/generate', data=dict(
  52. lat='I am bad data',
  53. long='echo test',
  54. radius='1',
  55. ), follow_redirects=True)
  56. assert b'<title>AP Terrain Generator</title>' in rv.data
  57. assert b'Error' in rv.data
  58. assert b'download="terrain.zip"' not in rv.data
  59. #out of bounds lon/lat
  60. rv = client.post('/generate', data=dict(
  61. lat='206.56',
  62. long='-400',
  63. radius='1',
  64. ), follow_redirects=True)
  65. assert b'<title>AP Terrain Generator</title>' in rv.data
  66. assert b'Error' in rv.data
  67. assert b'download="terrain.zip"' not in rv.data
  68. def test_simplegen(client):
  69. """Test that a small piece of terrain can be generated"""
  70. rv = client.post('/generate', data=dict(
  71. lat='-35.363261',
  72. long='149.165230',
  73. radius='1',
  74. ), follow_redirects=True)
  75. assert b'<title>AP Terrain Generator</title>' in rv.data
  76. assert b'Error' not in rv.data
  77. assert b'Tiles outside of +60 to -60 latitude were requested' not in rv.data
  78. assert b'download="terrain.zip"' in rv.data
  79. uuidkey = (rv.data.split(b"footer")[1][1:-2]).decode("utf-8")
  80. assert uuidkey != ""
  81. #file should be ready for download and around 2MB in size
  82. rdown = client.get('/terrain/' + uuidkey + ".zip", follow_redirects=True)
  83. assert b'404 Not Found' not in rdown.data
  84. assert len(rdown.data) > (1*1024*1024)
  85. def test_simplegenoutside(client):
  86. """Test that a small piece of terrain can be generated with partial outside +-60latitude"""
  87. rv = client.post('/generate', data=dict(
  88. lat='-58.363261',
  89. long='149.165230',
  90. radius='200',
  91. ), follow_redirects=True)
  92. assert b'<title>AP Terrain Generator</title>' in rv.data
  93. assert b'Error' not in rv.data
  94. assert b'Tiles outside of +60 to -60 latitude were requested' in rv.data
  95. assert b'download="terrain.zip"' in rv.data
  96. uuidkey = (rv.data.split(b"footer")[1][1:-2]).decode("utf-8")
  97. assert uuidkey != ""
  98. #file should be ready for download and around 2MB in size
  99. rdown = client.get('/terrain/' + uuidkey + ".zip", follow_redirects=True)
  100. assert b'404 Not Found' not in rdown.data
  101. assert len(rdown.data) > (0.25*1024*1024)
  102. def test_multigen(client):
  103. """Test that a a few small piece of terrains can be generated"""
  104. rva = client.post('/generate', data=dict(
  105. lat='-35.363261',
  106. long='149.165230',
  107. radius='1',
  108. ), follow_redirects=True)
  109. time.sleep(0.1)
  110. rvb = client.post('/generate', data=dict(
  111. lat='-35.363261',
  112. long='147.165230',
  113. radius='10',
  114. ), follow_redirects=True)
  115. time.sleep(0.1)
  116. rvc = client.post('/generate', data=dict(
  117. lat='-30.363261',
  118. long='137.165230',
  119. radius='100',
  120. ), follow_redirects=True)
  121. time.sleep(0.1)
  122. # Assert reponse is OK and get UUID for each ter gen
  123. allUuid = []
  124. for rv in [rva, rvb, rvc]:
  125. assert b'<title>AP Terrain Generator</title>' in rv.data
  126. assert b'Error' not in rv.data
  127. assert b'download="terrain.zip"' in rv.data
  128. uuidkey = (rv.data.split(b"footer")[1][1:-2]).decode("utf-8")
  129. assert uuidkey != ""
  130. allUuid.append(uuidkey)
  131. #files should be ready for download and around 0.7MB in size
  132. for uukey in allUuid:
  133. rdown = client.get('/terrain/' + uukey + ".zip", follow_redirects=True)
  134. assert b'404 Not Found' not in rdown.data
  135. assert len(rdown.data) > (0.7*1024*1024)