app_test.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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. #with app.app_context():
  24. # app.init_db()
  25. yield client
  26. #shutdown()
  27. def test_homepage(client):
  28. """Test that the homepage can be generated"""
  29. rv = client.get('/')
  30. # assert all the controls are there
  31. assert b'<title>AP Terrain Generator</title>' in rv.data
  32. assert b'<form action="/generate" method="post">' in rv.data
  33. assert b'<input type="text" id="lat" name="lat" value="-35.363261">' in rv.data
  34. assert b'<input type="text" id="long" name="long" value="149.165230">' in rv.data
  35. assert b'<input type="number" id="radius" name="radius" value="100" min="1" max="400">' in rv.data
  36. assert b'<input type="submit" value="Submit" method="post">' in rv.data
  37. def test_badinput(client):
  38. """Test bad inputs"""
  39. # no input
  40. rv = client.post('/generate', data=dict(
  41. ), follow_redirects=True)
  42. assert b'<title>AP Terrain Generator</title>' in rv.data
  43. assert b'Error' in rv.data
  44. assert b'Link To Download' not in rv.data
  45. #partial input
  46. rv = client.post('/generate', data=dict(
  47. lat='-35.363261',
  48. long='149.165230',
  49. ), follow_redirects=True)
  50. assert b'<title>AP Terrain Generator</title>' in rv.data
  51. assert b'Error' in rv.data
  52. assert b'Link To Download' not in rv.data
  53. #bad lon/lat
  54. rv = client.post('/generate', data=dict(
  55. lat='I am bad data',
  56. long='echo test',
  57. radius='1',
  58. ), follow_redirects=True)
  59. assert b'<title>AP Terrain Generator</title>' in rv.data
  60. assert b'Error' in rv.data
  61. assert b'download="terrain.zip"' not in rv.data
  62. #out of bounds lon/lat
  63. rv = client.post('/generate', data=dict(
  64. lat='206.56',
  65. long='-400',
  66. radius='1',
  67. ), follow_redirects=True)
  68. assert b'<title>AP Terrain Generator</title>' in rv.data
  69. assert b'Error' in rv.data
  70. assert b'download="terrain.zip"' not in rv.data
  71. def test_simplegen(client):
  72. """Test that a small piece of terrain can be generated"""
  73. rv = client.post('/generate', data=dict(
  74. lat='-35.363261',
  75. long='149.165230',
  76. radius='1',
  77. ), follow_redirects=True)
  78. assert b'<title>AP Terrain Generator</title>' in rv.data
  79. assert b'Error' not in rv.data
  80. assert b'download="terrain.zip"' in rv.data
  81. uuidkey = (rv.data.split(b"footer")[1][1:-2]).decode("utf-8")
  82. assert uuidkey != ""
  83. #wait for generator to complete, up to 1 second
  84. time.sleep(1)
  85. #file should be ready for download and around 2MB in size
  86. rdown = client.get('/terrain/' + uuidkey + ".zip", follow_redirects=True)
  87. assert len(rdown.data) > (1*1024*1024)
  88. #shutdown()
  89. def test_multigen(client):
  90. """Test that a a few small piece of terrains can be generated"""
  91. rva = client.post('/generate', data=dict(
  92. lat='-35.363261',
  93. long='149.165230',
  94. radius='1',
  95. ), follow_redirects=True)
  96. time.sleep(0.1)
  97. rvb = client.post('/generate', data=dict(
  98. lat='-35.363261',
  99. long='147.165230',
  100. radius='10',
  101. ), follow_redirects=True)
  102. time.sleep(0.1)
  103. rvc = client.post('/generate', data=dict(
  104. lat='-30.363261',
  105. long='137.165230',
  106. radius='100',
  107. ), follow_redirects=True)
  108. time.sleep(0.1)
  109. # Assert reponse is OK and get UUID for each ter gen
  110. allUuid = []
  111. for rv in [rva, rvb, rvc]:
  112. assert b'<title>AP Terrain Generator</title>' in rv.data
  113. assert b'Error' not in rv.data
  114. assert b'download="terrain.zip"' in rv.data
  115. uuidkey = (rv.data.split(b"footer")[1][1:-2]).decode("utf-8")
  116. assert uuidkey != ""
  117. allUuid.append(uuidkey)
  118. #wait for generator to complete, up to 1 second
  119. time.sleep(1)
  120. #files should be ready for download and around 2MB in size
  121. for uukey in allUuid:
  122. rdown = client.get('/terrain/' + uukey + ".zip", follow_redirects=True)
  123. assert len(rdown.data) > (0.7*1024*1024)