runtests.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #!/usr/bin/env python
  2. import os
  3. import shutil
  4. import sys
  5. from django import setup
  6. TEST_RUNNER_PATH = os.path.dirname(os.path.abspath(__file__))
  7. sys.path.append(os.path.dirname(os.path.abspath(__file__)))
  8. def runtests():
  9. args, kwargs = parse_args()
  10. setup_testproject()
  11. run_django(*args, **kwargs)
  12. def parse_args():
  13. args = []
  14. kwargs = {
  15. 'verbosity': 1,
  16. 'noinput': True,
  17. }
  18. sys_argv = sys.argv[1:]
  19. if sys_argv and sys_argv[0] == 'test':
  20. sys_argv = sys_argv[1:]
  21. for arg in sys_argv:
  22. if arg == '--verbose':
  23. kwargs['verbosity'] = 2
  24. else:
  25. args.append(arg)
  26. return args, kwargs
  27. def setup_testproject():
  28. project_template_path = os.path.join(TEST_RUNNER_PATH, 'misago/project_template')
  29. test_project_path = os.path.join(TEST_RUNNER_PATH, "testproject")
  30. if os.path.exists(test_project_path):
  31. shutil.rmtree(test_project_path)
  32. shutil.copytree(project_template_path, test_project_path)
  33. module_init_path = os.path.join(test_project_path, '__init__.py')
  34. with open(module_init_path, "w") as py_file:
  35. py_file.write('')
  36. settings_path = os.path.join(
  37. test_project_path, 'project_name', 'settings.py')
  38. with open(settings_path, "r") as py_file:
  39. settings_file = py_file.read()
  40. # Do some configuration magic
  41. settings_file = settings_file.replace('{{ project_name }}', 'testproject.project_name')
  42. settings_file = settings_file.replace('{{ secret_key }}', 't3stpr0j3ct')
  43. settings_file += """
  44. # disable account validation via Stop Forum Spam
  45. MISAGO_NEW_REGISTRATIONS_VALIDATORS = (
  46. 'misago.users.validators.validate_gmail_email',
  47. )
  48. # store mails in memory
  49. EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
  50. # use in-memory cache
  51. CACHES = {
  52. 'default': {
  53. 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
  54. 'LOCATION': 'uniqu3-sn0wf14k3'
  55. }
  56. }
  57. # Use MD5 password hashing to speed up test suite
  58. PASSWORD_HASHERS = (
  59. 'django.contrib.auth.hashers.MD5PasswordHasher',
  60. )
  61. # Use english search config
  62. MISAGO_SEARCH_CONFIG = 'english'
  63. # Register test post validator
  64. MISAGO_POST_VALIDATORS = [
  65. 'misago.core.testproject.validators.test_post_validator',
  66. ]
  67. # Register test post search filter
  68. MISAGO_POST_SEARCH_FILTERS = [
  69. 'misago.core.testproject.searchfilters.test_filter',
  70. ]
  71. """
  72. if os.environ.get('TRAVIS'):
  73. settings_file += """
  74. DATABASES = {
  75. 'default': {
  76. 'ENGINE': 'django.db.backends.postgresql_psycopg2',
  77. 'NAME': 'travis_ci_test',
  78. 'USER': 'postgres',
  79. 'PASSWORD': '',
  80. 'HOST': '127.0.0.1',
  81. 'PORT': '',
  82. }
  83. }
  84. TEST_NAME = 'travis_ci_test'
  85. """
  86. else:
  87. settings_file += """
  88. DATABASES = {
  89. 'default': {
  90. 'ENGINE': 'django.db.backends.postgresql_psycopg2',
  91. 'NAME': os.environ['POSTGRES_TEST_DB'],
  92. 'USER': os.environ['POSTGRES_USER'],
  93. 'PASSWORD': os.environ['POSTGRES_PASSWORD'],
  94. 'HOST': os.environ['POSTGRES_HOST'],
  95. 'PORT': 5432,
  96. }
  97. }
  98. """
  99. with open(settings_path, "w") as py_file:
  100. py_file.write(settings_file)
  101. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "testproject.project_name.settings")
  102. def run_django(*args, **kwargs):
  103. setup()
  104. from django.core.management import call_command
  105. sys.exit(call_command('test', *args, **kwargs))
  106. if __name__ == '__main__':
  107. runtests()