test_populate.py 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. import pytest
  2. from sqlalchemy.exc import OperationalError
  3. from sqlalchemy_utils.functions import create_database, drop_database
  4. from flaskbb.extensions import alembic, db
  5. from flaskbb.utils.populate import delete_settings_from_fixture, \
  6. create_settings_from_fixture, update_settings_from_fixture, \
  7. create_default_groups, create_test_data, insert_bulk_data, \
  8. create_welcome_forum, create_user
  9. from flaskbb.fixtures.groups import fixture as group_fixture
  10. from flaskbb.fixtures.settings import fixture as settings_fixture
  11. from flaskbb.user.models import Group, User
  12. from flaskbb.forum.models import Category, Topic, Post
  13. from flaskbb.management.models import Setting, SettingsGroup
  14. def test_delete_settings_from_fixture(default_settings):
  15. groups_count = SettingsGroup.query.count()
  16. assert len(settings_fixture) == groups_count
  17. deleted = delete_settings_from_fixture(settings_fixture)
  18. assert len(settings_fixture) == len(deleted)
  19. assert not SettingsGroup.query.count()
  20. assert not Setting.query.count()
  21. def test_create_settings_from_fixture(database):
  22. assert not SettingsGroup.query.count()
  23. assert not Setting.query.count()
  24. created = create_settings_from_fixture(settings_fixture)
  25. assert len(settings_fixture) == len(created)
  26. assert SettingsGroup.query.count() == len(created)
  27. def test_update_settings_from_fixture(database):
  28. def individual_settings(update_result):
  29. """helper that returns the number of settings that were updated"""
  30. return sum(len(settings_in_a_group) for settings_in_a_group in update_result.values())
  31. settings_fixture_group_count = len(settings_fixture)
  32. settings_fixture_setting_count = sum(
  33. len(settings_fixture[k][1]['settings']) for k in range(len(settings_fixture))
  34. )
  35. assert not SettingsGroup.query.count()
  36. assert not Setting.query.count()
  37. # No force-overwrite - the fixtures will be created because they do not exist.
  38. updated_1 = update_settings_from_fixture(settings_fixture)
  39. assert settings_fixture_group_count == len(updated_1)
  40. assert settings_fixture_group_count == SettingsGroup.query.count()
  41. assert settings_fixture_setting_count == individual_settings(updated_1)
  42. assert settings_fixture_setting_count == Setting.query.count()
  43. # force-overwrite - nothing changed so nothing should happen here
  44. force_updated_1 = update_settings_from_fixture(settings_fixture,
  45. overwrite_group=True,
  46. overwrite_setting=True)
  47. assert len(force_updated_1) == 0
  48. assert individual_settings(force_updated_1) == 0
  49. assert settings_fixture_group_count == SettingsGroup.query.count()
  50. assert settings_fixture_setting_count == Setting.query.count()
  51. fixture_to_update_with = (
  52. # a group where we change a lot
  53. ('general', {
  54. 'name': "General Settings",
  55. 'description': "This description is wrong.",
  56. 'settings': (
  57. # change value
  58. ('project_title', {
  59. 'value': "FlaskBB is cool!",
  60. 'value_type': "string",
  61. 'name': "Project title",
  62. 'description': "The title of the project.",
  63. }),
  64. # change name
  65. ('project_subtitle', {
  66. 'value': "A lightweight forum software in Flask",
  67. 'value_type': "string",
  68. 'name': "Subtitle of the project",
  69. 'description': "A short description of the project.",
  70. }),
  71. # change options (extra)
  72. ('posts_per_page', {
  73. 'value': 10,
  74. 'value_type': "integer",
  75. 'extra': {'min': 1},
  76. 'name': "Posts per page",
  77. 'description': "Number of posts displayed per page.",
  78. }),
  79. # change description
  80. ('topics_per_page', {
  81. 'value': 10,
  82. 'value_type': "integer",
  83. 'extra': {'min': 5},
  84. 'name': "Topics per page",
  85. 'description': "The number of topics to be displayed per page.",
  86. }),
  87. # add
  88. ('test_fixture', {
  89. 'description': 'This is a test fixture',
  90. 'name': 'Test Fixture',
  91. 'value': 'FlaskBBTest',
  92. 'value_type': 'string'
  93. }),
  94. )
  95. }),
  96. # a group where we change nothing
  97. ('auth', {
  98. 'name': 'Authentication Settings',
  99. 'description': 'Configurations for the Login and Register process!',
  100. # the same as in flaskbb/settings/fixtures/settings.py
  101. 'settings': (
  102. ('registration_enabled', {
  103. 'value': True,
  104. 'value_type': "boolean",
  105. 'name': "Enable Registration",
  106. 'description': "Enable or disable the registration",
  107. }),
  108. )
  109. }),
  110. # a wholly new group
  111. ('testgroup', {
  112. 'name': "Important settings",
  113. 'description': "Some settings without which the world would not work.",
  114. 'settings': (
  115. # change value
  116. ('monty_python', {
  117. 'value': "And now for something completely different...",
  118. 'value_type': "string",
  119. 'name': "Monty Python",
  120. 'description': "A random quote from Monty Python.",
  121. }),
  122. )
  123. })
  124. )
  125. # should add groups: testgroup
  126. # should add testgroup/monty_python, general/test_fixture
  127. updated_2 = update_settings_from_fixture(fixture_to_update_with)
  128. assert len(updated_2) == 2
  129. assert individual_settings(updated_2) == 2
  130. assert settings_fixture_group_count + 1 == SettingsGroup.query.count()
  131. assert settings_fixture_setting_count + 2 == Setting.query.count()
  132. fixture_to_update_with[2][1]['settings'][0][1]['description'] = "Something meaningless."
  133. # should update groups: general
  134. # should update settings: 4 in general, 1 in testgroup
  135. force_updated_2 = update_settings_from_fixture(fixture_to_update_with,
  136. overwrite_group=True,
  137. overwrite_setting=True)
  138. assert len(force_updated_2) == 2
  139. assert individual_settings(force_updated_2) == 5
  140. assert settings_fixture_group_count + 1 == SettingsGroup.query.count()
  141. assert settings_fixture_setting_count + 2 == Setting.query.count()
  142. modified_settings_fixture = [item for item in settings_fixture]
  143. modified_settings_fixture.append(
  144. # another wholly new group
  145. ('testgroup2', {
  146. 'name': "Important settings",
  147. 'description': "Some settings without which the world would not work.",
  148. 'settings': (
  149. # change value
  150. ('monty_python_reborn', {
  151. 'value': "And now for something completely different...",
  152. 'value_type': "string",
  153. 'name': "Monty Python",
  154. 'description': "A random quote from Monty Python.",
  155. }),
  156. )
  157. })
  158. )
  159. # should revert 4 in general
  160. # should add testgroup2 and one subitem
  161. force_updated_3 = update_settings_from_fixture(modified_settings_fixture,
  162. overwrite_group=True,
  163. overwrite_setting=True)
  164. assert len(force_updated_3) == 2
  165. assert individual_settings(force_updated_3) == 5
  166. assert settings_fixture_group_count + 2 == SettingsGroup.query.count()
  167. assert settings_fixture_setting_count + 3 == Setting.query.count()
  168. def test_create_user(default_groups):
  169. user = User.query.filter_by(username="admin").first()
  170. assert not user
  171. user = create_user(username="admin", password="test",
  172. email="test@example.org", groupname="admin")
  173. assert user.username == "admin"
  174. assert user.permissions["admin"]
  175. def test_create_welcome_forum(default_groups):
  176. assert not create_welcome_forum()
  177. create_user(username="admin", password="test",
  178. email="test@example.org", groupname="admin")
  179. assert create_welcome_forum()
  180. def test_create_test_data(database):
  181. assert Category.query.count() == 0
  182. data_created = create_test_data()
  183. assert Category.query.count() == data_created['categories']
  184. def test_insert_bulk_data(database):
  185. assert not insert_bulk_data(topic_count=1, post_count=1)
  186. create_test_data(categories=1, forums=1, topics=0)
  187. assert Topic.query.count() == 0
  188. topics, posts = insert_bulk_data(topic_count=1, post_count=1)
  189. assert Topic.query.count() == topics
  190. # -1 bc the topic post also counts as post
  191. assert Post.query.count() - 1 == posts
  192. def test_create_default_groups(database):
  193. """Test that the default groups are created correctly."""
  194. assert Group.query.count() == 0
  195. create_default_groups()
  196. assert Group.query.count() == len(group_fixture)
  197. for key, attributes in group_fixture.items():
  198. group = Group.query.filter_by(name=key).first()
  199. for attribute, value in attributes.items():
  200. assert getattr(group, attribute) == value
  201. def test_migrations_upgrade():
  202. with pytest.raises(OperationalError):
  203. User.query.all()
  204. # ensure that the database is created
  205. create_database(db.engine.url)
  206. alembic.upgrade()
  207. assert len(User.query.all()) == 0
  208. drop_database(db.engine.url)