HCE Project Python language Distributed Tasks Manager Application, Distributed Crawler Application and client API bindings.  2.0.0-chaika
Hierarchical Cluster Engine Python language binding
ftest_FieldsSQLExpressionEvaluator.py
Go to the documentation of this file.
1 '''
2 Created on Jul 13, 2016
3 
4 @author: alexander
5 '''
6 import unittest
7 import logging.config
8 import ConfigParser
9 import datetime
10 
11 import dc_crawler.DBTasksWrapper as DBTasksWrapper
12 import dc.EventObjects
13 from app.FieldsSQLExpressionEvaluator import FieldsSQLExpressionEvaluator
14 import app.Consts as APP_CONSTS
15 from app.Utils import SQLExpression
16 
17 
18 def getLogger(name='test'):
19  # create logger
20  logger = logging.getLogger(name)
21  logger.setLevel(logging.DEBUG)
22 
23  # create console handler and set level to debug
24  ch = logging.StreamHandler()
25  ch.setLevel(logging.DEBUG)
26 
27  # create formatter
28  formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
29 
30  # add formatter to ch
31  ch.setFormatter(formatter)
32 
33  # add ch to logger
34  logger.addHandler(ch)
35 
36  return logger
37 
38 class Test(unittest.TestCase):
39  CONFIG_NAME = "../../ini/db-task.ini"
40 
41  SITE_ID = '1234567890'
42  URL = 'http://127.0.0.1'
43 
44  TEST_URL_PROPERTY_CAST_TO_INTEGER = "[{\"URL\":{\"Status\":{\"IF(%ERRORMASK% & 128 > 0, 1, %STATUS%)\":0}}}]"
45  TEST_URL_PROPERTY_CAST_TO_STRING = \
46  "[{\"URL\":{\"HTTPMethod\":{\"IF(%ERRORMASK% & 128 > 0, 'post', %HTTPMETHOD%)\":1}}}]"
47  TEST_URL_PROPERTY_CAST_TO_DATETIME = \
48  "[{\"URL\":{\"PDate\":{\"IF(%ERRORMASK% & 128 > 0, '2016-07-01 00:00:00', %PDATE%)\":2}}}]"
49  TEST_URL_PROPERTY_CAST_TO_UNSUPPORT = "[{\"URL\":{\"Status\":{\"IF(%ERRORMASK% & 128 > 0, 1, %STATUS%)\":3}}}]"
50 
51  TEST_SITE_PROPERTY_CAST_TO_INTEGER = "[{\"Site\":{\"Errors\":{\"IF(%ERRORMASK% & 128 > 0, 1, %ERRORS%)\":0}}}]"
52 
53  TEST_PDATE_TIME = "[{\"pattern\": \".*bbc.com\/dir1\/.*\", \"value\":\"IF(TIME(%PDATE%)='00:00:01', TIME(NOW()), TIME(%PDATE%))\"}]"
54 
55  def setUp(self):
56  cfgParser = ConfigParser.ConfigParser()
57  cfgParser.read(self.CONFIG_NAME)
58  self.wrapper = DBTasksWrapper.DBTasksWrapper(cfgParser)
59  self.logger = getLogger('hce')
60 
61 
62  def tearDown(self):
63  pass
64 
65 
66  # # Get object ('Site' or 'URL')
67  #
68  # @param objectName - name of object
69  # @param fields - dict of names and values for filling of object
70  # @return object instance
71  def getObject(self, objectName, fields):
72  # variable for result
73  obj = None
74 
75  if objectName == FieldsSQLExpressionEvaluator.OBJECT_NAME_SITE:
76  # Create instance of 'Site'
77  obj = dc.EventObjects.Site(self.URL)
78  elif objectName == FieldsSQLExpressionEvaluator.OBJECT_NAME_URL:
79  obj = dc.EventObjects.URL(self.SITE_ID, self.URL) # pylint: disable=R0204
80 
81  if obj is not None:
82  for fieldName, fieldValue in fields.items():
83  if hasattr(obj, fieldName):
84  setattr(obj, fieldName, fieldValue)
85 
86  return obj
87 
88 
89  # # Get site properties
90  #
91  # @param propertyName
92  # @param propertyValue
93  # @return site properties dict
94  def getSiteProperties(self, propertyName, propertyValue):
95  # variable for result
96  ret = {}
97  if isinstance(propertyName, basestring) and propertyValue is not None:
98  ret[propertyName] = propertyValue
99 
100  return ret
101 
102 
104 
105  errorMessage = "Return wrong 'status' value"
106  siteProperties = self.getSiteProperties(APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER, \
108 
109  urlObj = self.getObject(FieldsSQLExpressionEvaluator.OBJECT_NAME_URL, {'status':7, 'errorMask':128})
110  changedFieldsDict = FieldsSQLExpressionEvaluator.execute(siteProperties, self.wrapper, None, urlObj, self.logger, \
111  APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER)
112  self.assertTrue(changedFieldsDict["status"] == 1, errorMessage)
113 
114 
115  urlObj = self.getObject(FieldsSQLExpressionEvaluator.OBJECT_NAME_URL, {'status':7, 'errorMask':127})
116  changedFieldsDict = FieldsSQLExpressionEvaluator.execute(siteProperties, self.wrapper, None, urlObj, self.logger, \
117  APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER)
118  self.assertTrue(changedFieldsDict["status"] == 7, errorMessage)
119 
120 
122 
123  errorMessage = "Return wrong 'httpMethod' value"
124  siteProperties = self.getSiteProperties(APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER, \
126 
127  urlObj = self.getObject(FieldsSQLExpressionEvaluator.OBJECT_NAME_URL, {'httpMethod':'post', 'errorMask':128})
128  changedFieldsDict = FieldsSQLExpressionEvaluator.execute(siteProperties, self.wrapper, None, urlObj, self.logger, \
129  APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER)
130  self.assertTrue(changedFieldsDict["httpMethod"] == 'post', errorMessage)
131 
132 
133  urlObj = self.getObject(FieldsSQLExpressionEvaluator.OBJECT_NAME_URL, {'httpMethod':'get', 'errorMask':127})
134  changedFieldsDict = FieldsSQLExpressionEvaluator.execute(siteProperties, self.wrapper, None, urlObj, self.logger, \
135  APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER)
136  self.assertTrue(changedFieldsDict["httpMethod"] == 'get', errorMessage)
137 
138 
140 
141  errorMessage = "Return wrong 'pDate' value"
142  siteProperties = self.getSiteProperties(APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER, \
144 
145  urlObj = self.getObject(FieldsSQLExpressionEvaluator.OBJECT_NAME_URL,
146  {'pDate':'2016-01-01 00:00:00', 'errorMask':128})
147  changedFieldsDict = FieldsSQLExpressionEvaluator.execute(siteProperties, self.wrapper, None, urlObj, self.logger, \
148  APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER)
149  self.assertTrue(changedFieldsDict["pDate"] == '2016-07-01 00:00:00', errorMessage + \
150  ' pDate: ' + str(urlObj.pDate))
151 
152 
153  urlObj = self.getObject(FieldsSQLExpressionEvaluator.OBJECT_NAME_URL,
154  {'pDate':'2016-01-01 00:00:00', 'errorMask':127})
155  changedFieldsDict = FieldsSQLExpressionEvaluator.execute(siteProperties, self.wrapper, None, urlObj, self.logger, \
156  APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER)
157  self.assertTrue(changedFieldsDict["pDate"] == '2016-01-01 00:00:00', errorMessage + \
158  ' pDate: ' + str(urlObj.pDate))
159 
160 
162 
163  errorMessage = "Return wrong 'status' value"
164  siteProperties = self.getSiteProperties(APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER, \
166 
167  urlObj = self.getObject(FieldsSQLExpressionEvaluator.OBJECT_NAME_URL, {'status':4, 'errorMask':128})
168  changedFieldsDict = FieldsSQLExpressionEvaluator.execute(siteProperties, self.wrapper, None, urlObj, self.logger, \
169  APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER)
170  self.assertTrue(changedFieldsDict["status"] == 4, errorMessage)
171 
172 
173  urlObj = self.getObject(FieldsSQLExpressionEvaluator.OBJECT_NAME_URL, {'status':4, 'errorMask':127})
174  changedFieldsDict = FieldsSQLExpressionEvaluator.execute(siteProperties, self.wrapper, None, urlObj, self.logger, \
175  APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER)
176  self.assertTrue(changedFieldsDict["status"] == 4, errorMessage)
177 
178 
180 
181  errorMessage = "Return wrong 'status' value"
182  siteProperties = self.getSiteProperties(APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_PROCESSOR, \
184 
185  urlObj = self.getObject(FieldsSQLExpressionEvaluator.OBJECT_NAME_URL, {'status':4, 'errorMask':128})
186  changedFieldsDict = FieldsSQLExpressionEvaluator.execute(siteProperties, self.wrapper, None, urlObj, self.logger, \
187  APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER)
188  self.assertTrue(changedFieldsDict["status"] == 4, errorMessage)
189 
190 
191  urlObj = self.getObject(FieldsSQLExpressionEvaluator.OBJECT_NAME_URL, {'status':4, 'errorMask':127})
192  changedFieldsDict = FieldsSQLExpressionEvaluator.execute(siteProperties, self.wrapper, None, urlObj, self.logger, \
193  APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER)
194  self.assertTrue(changedFieldsDict["status"] == 4, errorMessage)
195 
196 
198 
199  errorMessage = "Return wrong 'errors' value"
200  siteProperties = self.getSiteProperties(APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER, \
202 
203  siteObj = self.getObject(FieldsSQLExpressionEvaluator.OBJECT_NAME_SITE, {'errors':2, 'errorMask':128})
204 
205  self.logger.debug('siteObj.errors = ' + str(siteObj.errors))
206  changedFieldsDict = FieldsSQLExpressionEvaluator.execute(siteProperties, self.wrapper, siteObj, None, self.logger, \
207  APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER)
208  self.assertTrue(changedFieldsDict["errors"] == 1, errorMessage)
209 
210  siteObj = self.getObject(FieldsSQLExpressionEvaluator.OBJECT_NAME_SITE, {'errors':2, 'errorMask':127})
211  changedFieldsDict = FieldsSQLExpressionEvaluator.execute(siteProperties, self.wrapper, siteObj, None, self.logger, \
212  APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER)
213  self.assertTrue(changedFieldsDict["errors"] == 2, errorMessage)
214 
215 
216  def testPDateTime(self):
217  errorMessage = "Return wrong 'pDate' value"
218  siteProperties = self.getSiteProperties(APP_CONSTS.SQL_EXPRESSION_FIELDS_PDATE_TIME, \
219  self.TEST_PDATE_TIME)
220  urlObj = self.getObject(FieldsSQLExpressionEvaluator.OBJECT_NAME_URL,
221  {'status':4, 'errorMask':0, \
222  'pDate':datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), \
223  'url':'http://bbc.com/dir1/index.html'})
224  pubdate = FieldsSQLExpressionEvaluator.evaluatePDateTime(siteProperties, self.wrapper, urlObj, self.logger, None)
225 
226  self.logger.debug("pubdate = " + str(pubdate))
227  self.assertTrue(pubdate == str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")), errorMessage)
228 
229 if __name__ == "__main__":
230  # import sys;sys.argv = ['', 'Test.testName']
231  unittest.main()