app_test.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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="submit" value="Submit" method="post">' in rv.data
  24. def test_status(client):
  25. """Test bad inputs to status page"""
  26. uuidkey = str(uuid.uuid1())
  27. rc = client.get('/status/' + uuidkey, follow_redirects=True)
  28. assert b'Error: bad UUID' in rc.data
  29. rc = client.get('/status/', follow_redirects=True)
  30. assert b'404 Not Found' in rc.data
  31. rc = client.get('/status/notauuid123' + uuidkey, follow_redirects=True)
  32. assert b'404 Not Found' in rc.data
  33. def test_badinput(client):
  34. """Test bad inputs"""
  35. # no input
  36. rv = client.post('/generate', data=dict(
  37. ), follow_redirects=True)
  38. assert b'<title>AP Terrain Generator</title>' in rv.data
  39. assert b'Error' in rv.data
  40. assert b'Link To Download' not in rv.data
  41. #partial input
  42. rv = client.post('/generate', data=dict(
  43. lat='-35.363261',
  44. long='149.165230',
  45. ), follow_redirects=True)
  46. assert b'<title>AP Terrain Generator</title>' in rv.data
  47. assert b'Error' in rv.data
  48. assert b'Link To Download' not in rv.data
  49. #bad lon/lat
  50. rv = client.post('/generate', data=dict(
  51. lat='I am bad data',
  52. long='echo test',
  53. radius='1',
  54. ), follow_redirects=True)
  55. assert b'<title>AP Terrain Generator</title>' in rv.data
  56. assert b'Error' in rv.data
  57. assert b'Link To Download' not in rv.data
  58. #out of bounds lon/lat
  59. rv = client.post('/generate', data=dict(
  60. lat='206.56',
  61. long='-400',
  62. radius='1',
  63. ), follow_redirects=True)
  64. assert b'<title>AP Terrain Generator</title>' in rv.data
  65. assert b'Error' in rv.data
  66. assert b'Link To Download' not in rv.data
  67. def test_simplegen(client):
  68. """Test that a small piece of terrain can be generated"""
  69. rv = client.post('/generate', data=dict(
  70. lat='-35.363261',
  71. long='149.165230',
  72. radius='1',
  73. ), follow_redirects=True)
  74. assert b'<title>AP Terrain Generator</title>' in rv.data
  75. assert b'Error' not in rv.data
  76. assert b'Link To Download' in rv.data
  77. uuidkey = (rv.data.split(b"footer")[1][1:-2]).decode("utf-8")
  78. assert uuidkey != ""
  79. #wait for generator to complete, up to 30 seconds
  80. startime = time.time()
  81. while True:
  82. time.sleep(0.5)
  83. if time.time() - startime > 30:
  84. assert False
  85. break
  86. else:
  87. rc = client.get('/status/' + uuidkey, follow_redirects=True)
  88. if "ready" in rc.data.decode("utf-8") :
  89. break
  90. #file should be ready for download and around 2MB in size
  91. rdown = client.get('/terrain/' + uuidkey + ".zip", follow_redirects=True)
  92. assert len(rdown.data) > (1*1024*1024)
  93. #shutdown()
  94. def test_multigen(client):
  95. """Test that a a few small piece of terrains can be generated"""
  96. rva = client.post('/generate', data=dict(
  97. lat='-35.363261',
  98. long='149.165230',
  99. radius='1',
  100. ), follow_redirects=True)
  101. time.sleep(0.1)
  102. rvb = client.post('/generate', data=dict(
  103. lat='-35.363261',
  104. long='147.165230',
  105. radius='1',
  106. ), follow_redirects=True)
  107. time.sleep(0.1)
  108. rvc = client.post('/generate', data=dict(
  109. lat='-30.363261',
  110. long='137.165230',
  111. radius='1',
  112. ), follow_redirects=True)
  113. time.sleep(0.1)
  114. # Assert reponse is OK and get UUID for each ter gen
  115. allUuid = []
  116. for rv in [rva, rvb, rvc]:
  117. assert b'<title>AP Terrain Generator</title>' in rv.data
  118. assert b'Error' not in rv.data
  119. assert b'Link To Download' in rv.data
  120. uuidkey = (rv.data.split(b"footer")[1][1:-2]).decode("utf-8")
  121. assert uuidkey != ""
  122. allUuid.append(uuidkey)
  123. #wait for generator to complete, up to 50 seconds
  124. startime = time.time()
  125. allUuidComplete = []
  126. while len(allUuid) != len(allUuidComplete):
  127. time.sleep(1)
  128. if time.time() - startime > 120:
  129. break
  130. else:
  131. # check if done
  132. for uukey in allUuid:
  133. rcc = client.get('/status/' + uukey, follow_redirects=True)
  134. if "ready" in rcc.data.decode("utf-8") and (uukey not in allUuidComplete):
  135. allUuidComplete.append(uukey)
  136. #files should be ready for download and around 2MB in size
  137. for uukey in allUuid:
  138. rdown = client.get('/terrain/' + uukey + ".zip", follow_redirects=True)
  139. assert len(rdown.data) > (0.7*1024*1024)
  140. print(wholeStat())
  141. shutdown()