app_test.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. import os
  2. import time
  3. import pytest
  4. import uuid
  5. from app import app, queueStatus, shutdown, wholeStat
  6. @pytest.fixture
  7. def client():
  8. app.config['TESTING'] = True
  9. with app.test_client() as client:
  10. #with app.app_context():
  11. # app.init_db()
  12. yield client
  13. #shutdown()
  14. def test_homepage(client):
  15. """Test that the homepage can be generated"""
  16. rv = client.get('/')
  17. # assert all the controls are there
  18. assert b'<title>AP Terrain Generator</title>' in rv.data
  19. assert b'<form action="/generate" method="post">' in rv.data
  20. assert b'<input type="text" id="lat" name="lat" value="-35.363261">' in rv.data
  21. assert b'<input type="text" id="long" name="long" value="149.165230">' in rv.data
  22. assert b'<input type="number" id="radius" name="radius" value="100" min="1" max="400">' in rv.data
  23. assert b'<input type="number" id="spacing" name="spacing" value="100" min="50" max="500">' in rv.data
  24. assert b'<input type="submit" value="Submit" method="post">' in rv.data
  25. def test_status(client):
  26. """Test bad inputs to status page"""
  27. uuidkey = str(uuid.uuid1())
  28. rc = client.get('/status/' + uuidkey, follow_redirects=True)
  29. assert b'Error: bad UUID' in rc.data
  30. rc = client.get('/status/', follow_redirects=True)
  31. assert b'404 Not Found' in rc.data
  32. rc = client.get('/status/notauuid123' + uuidkey, follow_redirects=True)
  33. assert b'404 Not Found' in rc.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. spacing='100'
  56. ), follow_redirects=True)
  57. assert b'<title>AP Terrain Generator</title>' in rv.data
  58. assert b'Error' in rv.data
  59. assert b'Link To Download' not in rv.data
  60. #out of bounds lon/lat
  61. rv = client.post('/generate', data=dict(
  62. lat='206.56',
  63. long='-400',
  64. radius='1',
  65. spacing='100'
  66. ), follow_redirects=True)
  67. assert b'<title>AP Terrain Generator</title>' in rv.data
  68. assert b'Error' in rv.data
  69. assert b'Link To Download' not in rv.data
  70. def test_simplegen(client):
  71. """Test that a small piece of terrain can be generated"""
  72. rv = client.post('/generate', data=dict(
  73. lat='-35.363261',
  74. long='149.165230',
  75. radius='1',
  76. spacing='200'
  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'Link To Download' 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 30 seconds
  84. startime = time.time()
  85. while True:
  86. time.sleep(0.5)
  87. if time.time() - startime > 30:
  88. assert False
  89. break
  90. else:
  91. rc = client.get('/status/' + uuidkey, follow_redirects=True)
  92. if "ready" in rc.data.decode("utf-8") :
  93. break
  94. #file should be ready for download and around 2MB in size
  95. rdown = client.get('/terrain/' + uuidkey + ".zip", follow_redirects=True)
  96. assert len(rdown.data) > (1*1024*1024)
  97. #shutdown()
  98. def test_multigen(client):
  99. """Test that a a few small piece of terrains can be generated"""
  100. rva = client.post('/generate', data=dict(
  101. lat='-35.363261',
  102. long='149.165230',
  103. radius='1',
  104. spacing='200'
  105. ), follow_redirects=True)
  106. time.sleep(0.1)
  107. rvb = client.post('/generate', data=dict(
  108. lat='-35.363261',
  109. long='147.165230',
  110. radius='1',
  111. spacing='200'
  112. ), follow_redirects=True)
  113. time.sleep(0.1)
  114. rvc = client.post('/generate', data=dict(
  115. lat='-30.363261',
  116. long='137.165230',
  117. radius='1',
  118. spacing='200'
  119. ), follow_redirects=True)
  120. time.sleep(0.1)
  121. # Assert reponse is OK and get UUID for each ter gen
  122. allUuid = []
  123. for rv in [rva, rvb, rvc]:
  124. assert b'<title>AP Terrain Generator</title>' in rv.data
  125. assert b'Error' not in rv.data
  126. assert b'Link To Download' in rv.data
  127. uuidkey = (rv.data.split(b"footer")[1][1:-2]).decode("utf-8")
  128. assert uuidkey != ""
  129. allUuid.append(uuidkey)
  130. #wait for generator to complete, up to 50 seconds
  131. startime = time.time()
  132. allUuidComplete = []
  133. while len(allUuid) != len(allUuidComplete):
  134. time.sleep(1)
  135. if time.time() - startime > 50:
  136. break
  137. else:
  138. # check if done
  139. for uukey in allUuid:
  140. rcc = client.get('/status/' + uukey, follow_redirects=True)
  141. if "ready" in rcc.data.decode("utf-8") and (uukey not in allUuidComplete):
  142. allUuidComplete.append(uukey)
  143. #files should be ready for download and around 2MB in size
  144. for uukey in allUuid:
  145. rdown = client.get('/terrain/' + uukey + ".zip", follow_redirects=True)
  146. assert len(rdown.data) > (0.7*1024*1024)
  147. print(wholeStat())
  148. shutdown()