# -*- encoding: UTF8 -*- # Test harness for CreateSwarmReview.py from __future__ import print_function import sys import unittest import os import re sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) import testp4 import P4 import logging import subprocess from CreateSwarmReview import CreateSwarmReview os.environ["LOGS"] = "." LOGGER_NAME = "TestCreateSwarmReview" LOG_FILE = "log-CreateSwarmReview.log" python3 = sys.version_info[0] >= 3 if python3: from unittest.mock import patch, Mock else: from mock import patch, Mock def ensureDirectory(directory): if not os.path.isdir(directory): os.makedirs(directory) def localDirectory(root, *dirs): "Create and ensure it exists" dir_path = os.path.join(root, *dirs) ensureDirectory(dir_path) return dir_path def create_file(file_name, contents): "Create file with specified contents" ensureDirectory(os.path.dirname(file_name)) if python3: contents = bytes(contents.encode()) with open(file_name, 'wb') as f: f.write(contents) def append_to_file(file_name, contents): "Append contents to file" if python3: contents = bytes(contents.encode()) with open(file_name, 'ab+') as f: f.write(contents) class TestCreateSwarmReview(unittest.TestCase): def __init__(self, methodName='runTest'): super(TestCreateSwarmReview, self).__init__(methodName=methodName) self.logger = logging.getLogger(LOGGER_NAME) self.logger.setLevel(logging.DEBUG) logformat = '%(levelname)s [%(asctime)s] [%(filename)s : %(lineno)d] - %(message)s' logging.basicConfig(format=logformat, filename=LOG_FILE, level=logging.DEBUG) def assertRegex(self, *args, **kwargs): if python3: return super(TestCreateSwarmReview, self).assertRegex(*args, **kwargs) else: return super(TestCreateSwarmReview, self).assertRegexpMatches(*args, **kwargs) def setUp(self): pass def tearDown(self): pass @patch('CreateSwarmReview.requests') def testCreateSwarmReview(self, requests_mock): """trigger fires and sends expected info to Swarm""" config_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "~test_config.yaml") with open(config_path, "w") as f: f.write(""" api: "api/v6" user: swarmtest ticket: A123453 review_description: "Please review me!\nDon't forget to check YYYY" paths: - //depot/inside/... """) args = ["-c", config_path, "--test-mode", "123"] trig = CreateSwarmReview(*args) result = trig.run() self.assertTrue(requests_mock.post.called) args, kwargs = requests_mock.post.call_args_list[0] self.assertEqual(('http://swarm.dev/api/v6/reviews',), args) self.assertDictEqual({'auth': ('swarmtest', 'A123453'), 'data': {'description': "Please review me! Don't forget to check YYYY", 'change': '123'}}, kwargs) # def testCreateSwarmReview(self, requests_mock): # """trigger fires and sends expected info to Swarm""" # self.server = testp4.P4Server() # trig_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "CreateSwarmReview.py") # config_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "test_config.yaml") # p4 = self.server.p4 # p4.logger = self.logger # # This works if no spaces in server root pathname! # port = p4.port.replace('"', '') # self.logger.debug("port: |%s|" % port) # triggers = p4.fetch_triggers() # triggers['Triggers'] = ['create_swarm_review change-commit //... " python ' + trig_path + # " -p %quote%" + port + "%quote% -u " + p4.user + # " -c %s " % config_path + # ' %change% "'] # self.logger.debug(triggers) # p4.save_triggers(triggers) # # Reconnect to pick up changes # p4.disconnect() # p4.connect() # with open(config_path, "w") as f: # f.write(""" # api: "api/v6" # user: perforce # ticket: AA1233C0FD5EF69605B08070AFB86711 # review_description: "Please review me!\nDon't forget to check XXX" # paths: # - //depot/inside/... # """) # inside = localDirectory(self.server.client_root, "inside") # inside_file1 = os.path.join(inside, "inside_file1") # create_file(inside_file1, 'Test content') # p4.run('add', inside_file1) # result = p4.run('submit', '-d', 'inside_file1 added') # self.assertEquals("Review created", result) # outside = localDirectory(self.server.client_root, "outside") # outside_file1 = os.path.join(inside, "outside_file1") # create_file(outside_file1, 'Test content') # p4.run('add', outside_file1) # result = p4.run('submit', '-d', 'outside_file1 added') # self.assertEquals("Review not created", result) if __name__ == '__main__': unittest.main()