No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_field.py 5.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import os
  2. import logging
  3. import datetime
  4. from django.conf import settings
  5. from unittest import TestCase
  6. import unittest
  7. from EditorialModel.components import EmComponent, EmComponentNotExistError
  8. from EditorialModel.fields import EmField
  9. from EditorialModel.classes import EmClass
  10. from EditorialModel.classtypes import EmClassType
  11. from EditorialModel.types import EmType
  12. from EditorialModel.fieldgroups import EmFieldGroup
  13. from EditorialModel.test.utils import *
  14. from EditorialModel.fieldtypes import *
  15. from Database import sqlutils
  16. import sqlalchemy as sqla
  17. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Lodel.settings")
  18. TEST_FIELD_DBNAME = 'lodel2_test_field_db.sqlite'
  19. ## SetUpModule
  20. #
  21. # This function is called once for this module.
  22. # It is designed to overwrite the database configurations, and prepare objects for test_case initialization
  23. def setUpModule():
  24. initTestDb(TEST_FIELD_DBNAME)
  25. setDbConf(TEST_FIELD_DBNAME)
  26. logging.basicConfig(level=logging.CRITICAL)
  27. pass
  28. def tearDownModule():
  29. cleanDb(TEST_FIELD_DBNAME)
  30. pass
  31. ## FieldTestCase (Class)
  32. #
  33. # The parent class of all other test cases for the fields module.
  34. # It defines a SetUp function and some utility functions for EmField tests.
  35. class FieldTestCase(TestCase):
  36. @classmethod
  37. def setUpClass(cls):
  38. sqlsetup.init_db()
  39. # Generation of the test data
  40. testclass = EmClass.create("testclass1",EmClassType.entity)
  41. EmField_integer()
  42. EmFieldGroup.create('fieldgrp1',testclass)
  43. EmType.create('testtype1',testclass)
  44. saveDbState(TEST_FIELD_DBNAME)
  45. def setUp(self):
  46. restoreDbState(TEST_FIELD_DBNAME)
  47. self.testClass = EmClass("testclass1")
  48. self.testFieldType = EmField_integer()
  49. self.testFieldgroup = EmFieldGroup('fieldgrp1')
  50. self.testType = EmType('testtype1')
  51. ## Get_Field_Records (Function)
  52. #
  53. # Returns the list of fields corresponding to a given uid
  54. #
  55. # @param field EmField: EmField object
  56. # @return Number of found records
  57. def get_field_records(self,field):
  58. return self._get_field_records_Db(field)
  59. ## _Get_Field_Records_Db (Function)
  60. #
  61. # Queries the database to get the list of fields for a given uid
  62. #
  63. # @param field EmField: EmField object
  64. # @return Number of found records
  65. def _get_field_records_Db(self,field):
  66. dbe = field.db_engine
  67. fieldtable = sqla.Table(EmField.table, sqlutils.meta(dbe))
  68. conn = dbe.connect()
  69. req = fieldtable.select().where(fieldtable.c.uid==field.uid).where(fieldtable.c.name==field.name)
  70. res = conn.execute(req).fetchall()
  71. return len(res)
  72. ## Get_table_columns (Function)
  73. #
  74. # Returns the columns list of a table
  75. #
  76. # @param table_name str: Name of the table
  77. # @return list of columns
  78. def get_table_columns(self,table_name):
  79. return self._get_table_columns_Db(table_name)
  80. ## _Get_table_columns_Db (Function)
  81. #
  82. # Queries the database to get the list of columns of a table
  83. #
  84. # @param table_name str: Name of the table
  85. # @return list of columns
  86. def _get_table_columns_Db(self, table_name):
  87. dbe = self.testClass.db_engine
  88. table = sqla.Table(table_name, sqlutils.meta(dbe))
  89. return table.c
  90. ## TestField (Class)
  91. #
  92. # The test class for the fields module
  93. class TestField(FieldTestCase):
  94. ## Test_create (Function)
  95. #
  96. # tests the creation process of a field
  97. def testCreate(self):
  98. """ Testing fields creation process """
  99. '''
  100. field_values = {
  101. 'name':'testfield1',
  102. 'fieldgroup_id' : self.testFieldgroup.uid,
  103. 'fieldtype' : self.testFieldType,
  104. 'rel_to_type_id': self.testType.uid
  105. }
  106. '''
  107. field = EmField.create(name='testfield1', fieldgroup=self.testFieldgroup, fieldtype=self.testFieldType)
  108. # We check that the field has been added in the em_field table
  109. field_records = self.get_field_records(field)
  110. self.assertGreater(field_records,0)
  111. # We check that the field has been added as a column in the corresponding table
  112. field_table_columns = self.get_table_columns(field.get_class_table())
  113. field_column_args = self.testFieldType.sqlalchemy_args()
  114. field_column_args['name']='testfield1'
  115. field_column = sqla.Column(**field_column_args)
  116. self.assertIn(field_column.name, field_table_columns)
  117. pass
  118. def test_deletion(self):
  119. """ Testing fields deletion process """
  120. field_names = ['field1', 'field2']
  121. for name in field_names:
  122. EmField.create(name=name, fieldgroup=self.testFieldgroup, fieldtype = self.testFieldType)
  123. for i,name in enumerate(field_names):
  124. test_field = EmField(name)
  125. self.assertTrue(test_field.delete())
  126. cols = self.get_table_columns(self.testClass.name)
  127. for deleted_name in field_names[:i+1]:
  128. self.assertNotIn(deleted_name, cols, "Column is not deleted")
  129. for not_deleted_name in field_names[i+1:]:
  130. self.assertIn(not_deleted_name, cols, "A bad column was deleted")
  131. with self.assertRaises(EmComponentNotExistError, msg="This field should be deleted"):
  132. EmField(name)