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.

преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. from __future__ import unicode_literals
  2. import sys
  3. if __name__=="__main__":
  4. sys.path.extend([".", "app", "lib"])
  5. import webnotes
  6. import unittest
  7. from webnotes.model.meta import has_field
  8. from webnotes.model.code import load_doctype_module, get_module_name
  9. from webnotes.model.doctype import get_link_fields
  10. def make_test_records(doctype, verbose=0):
  11. webnotes.mute_emails = True
  12. if not webnotes.conn:
  13. webnotes.connect()
  14. for options in get_dependencies(doctype):
  15. if options.startswith("link:"):
  16. options = options[5:]
  17. if options == "[Select]":
  18. continue
  19. if options not in webnotes.test_objects:
  20. webnotes.test_objects[options] = []
  21. make_test_records(options, verbose)
  22. make_test_records_for_doctype(options, verbose)
  23. def get_modules(doctype):
  24. module = webnotes.conn.get_value("DocType", doctype, "module")
  25. test_module = load_doctype_module(doctype, module, "test_")
  26. return module, test_module
  27. def get_dependencies(doctype):
  28. module, test_module = get_modules(doctype)
  29. options_list = list(set([df.options for df in get_link_fields(doctype)] + [doctype]))
  30. if hasattr(test_module, "test_dependencies"):
  31. options_list += test_module.test_dependencies
  32. if hasattr(test_module, "test_ignore"):
  33. for doctype_name in test_module.test_ignore:
  34. if doctype_name in options_list:
  35. options_list.remove(doctype_name)
  36. return options_list
  37. def make_test_records_for_doctype(doctype, verbose=0):
  38. module, test_module = get_modules(doctype)
  39. if verbose:
  40. print "Making for " + doctype
  41. if hasattr(test_module, "make_test_records"):
  42. webnotes.test_objects[doctype] += test_module.make_test_records(verbose)
  43. elif hasattr(test_module, "test_records"):
  44. webnotes.test_objects[doctype] += make_test_objects(doctype, test_module.test_records, verbose)
  45. elif verbose:
  46. print_mandatory_fields(doctype)
  47. def make_test_objects(doctype, test_records, verbose=None):
  48. records = []
  49. for doclist in test_records:
  50. if not "doctype" in doclist[0]:
  51. doclist[0]["doctype"] = doctype
  52. d = webnotes.bean((webnotes.doclist(doclist)).copy())
  53. if webnotes.test_objects.get(d.doc.doctype):
  54. # do not create test records, if already exists
  55. return []
  56. if has_field(d.doc.doctype, "naming_series"):
  57. if not d.doc.naming_series:
  58. d.doc.naming_series = "_T-" + d.doc.doctype + "-"
  59. # submit if docstatus is set to 1 for test record
  60. docstatus = d.doc.docstatus
  61. d.doc.docstatus = 0
  62. d.insert()
  63. if docstatus == 1:
  64. d.submit()
  65. records.append(d.doc.name)
  66. return records
  67. def print_mandatory_fields(doctype):
  68. print "Please setup make_test_records for: " + doctype
  69. print "-" * 60
  70. doctype_obj = webnotes.get_doctype(doctype)
  71. print "Autoname: " + (doctype_obj[0].autoname or "")
  72. print "Mandatory Fields: "
  73. for d in doctype_obj.get({"reqd":1}):
  74. print d.parent + ":" + d.fieldname + " | " + d.fieldtype + " | " + (d.options or "")
  75. print
  76. def export_doc(doctype, docname):
  77. import json
  78. doclist = []
  79. ignore_list = ["name", "owner", "creation", "modified", "modified_by", "idx", "naming_series",
  80. "parenttype", "parent", "docstatus"]
  81. make_test_records(doctype)
  82. meta = webnotes.get_doctype(doctype)
  83. for d in webnotes.bean(doctype, docname):
  84. new_doc = {}
  85. for key, val in d.fields.iteritems():
  86. if val and key not in ignore_list:
  87. df = meta.get_field(key, d.parent or None, d.parentfield or None)
  88. if df and df.fieldtype == "Link":
  89. val = (webnotes.test_objects.get(df.options) or [val])[0]
  90. elif df and df.fieldtype == "Select" and df.options and df.options.startswith("link:"):
  91. val = (webnotes.test_objects.get(df.options[5:]) or [val])[0]
  92. if not df or df.reqd == 1:
  93. new_doc[key] = val
  94. doclist.append(new_doc)
  95. print json.dumps(doclist, indent=4, sort_keys=True).replace(" ", "\t")
  96. def run_unittest(doctype, verbose=False):
  97. module = webnotes.conn.get_value("DocType", doctype, "module")
  98. test_module = get_module_name(doctype, module, "test_")
  99. make_test_records(args.doctype[0], verbose=verbose)
  100. try:
  101. exec ('from %s import *' % test_module) in globals()
  102. del sys.argv[1:]
  103. unittest.main()
  104. except ImportError, e:
  105. print "No test module."
  106. def run_all_tests(verbose):
  107. import os
  108. for path, folders, files in os.walk("."):
  109. # print path
  110. for filename in files:
  111. if filename.startswith("test_") and filename.endswith(".py"):
  112. print filename[:-3]
  113. webnotes.session.user = "Administrator"
  114. _run_test(path, filename, verbose)
  115. webnotes.conn.rollback()
  116. webnotes.test_objects = {}
  117. print
  118. def _run_test(path, filename, verbose):
  119. import os, imp
  120. from webnotes.modules.utils import peval_doclist
  121. test_suite = unittest.TestSuite()
  122. if os.path.basename(os.path.dirname(path))=="doctype":
  123. txt_file = os.path.join(path, filename[5:].replace(".py", ".txt"))
  124. with open(txt_file, 'r') as f:
  125. doctype_doclist = peval_doclist(f.read())
  126. doctype = doctype_doclist[0]["name"]
  127. make_test_records(doctype, verbose)
  128. module = imp.load_source(filename[:-3], os.path.join(path, filename))
  129. test_suite.addTest(unittest.TestLoader().loadTestsFromModule(module))
  130. unittest.TextTestRunner(verbosity=1+(verbose and 1 or 0)).run(test_suite)
  131. if __name__=="__main__":
  132. import argparse
  133. parser = argparse.ArgumentParser(description='Run tests.')
  134. parser.add_argument('-d', '--doctype', nargs=1, metavar = "DOCTYPE",
  135. help="test for doctype")
  136. parser.add_argument('-v', '--verbose', default=False, action="store_true")
  137. parser.add_argument('-e', '--export', nargs=2, metavar="DOCTYPE DOCNAME")
  138. parser.add_argument('-a', '--all', default=False, action="store_true")
  139. parser.add_argument('-m', '--module', default=1, metavar="MODULE")
  140. args = parser.parse_args()
  141. webnotes.print_messages = args.verbose
  142. if not webnotes.conn:
  143. webnotes.connect()
  144. if args.doctype:
  145. run_unittest(args.doctype[0], verbose=args.verbose)
  146. elif args.all:
  147. run_all_tests(args.verbose)
  148. elif args.export:
  149. export_doc(args.export[0], args.export[1])
  150. elif args.module:
  151. test_suite = unittest.TestSuite()
  152. __import__(args.module)
  153. test_suite.addTest(unittest.TestLoader().loadTestsFromModule(sys.modules[args.module]))
  154. unittest.TextTestRunner(verbosity=1+(args.verbose and 1 or 0)).run(test_suite)