class TestCommandTaskWithMockPopen(MockLoggerMixin, unittest.TestCase):
    """ Run command tasks with a mocked popen """

    def setUp(self):
        self.global_config = BaseGlobalConfig()
        self.project_config = BaseProjectConfig(
            self.global_config, config={"noyaml": True}
        )
        self.task_config = TaskConfig()

        self._task_log_handler.reset()
        self.task_log = self._task_log_handler.messages

        self.Popen = MockPopen()
        self.r = Replacer()
        self.r.replace("cumulusci.tasks.command.subprocess.Popen", self.Popen)
        self.addCleanup(self.r.restore)

    def test_functional_mock_command(self):
        """ Functional test that runs a command with mocked
        popen results and checks the log.
        """

        self.task_config.config["options"] = {"command": "ls -la"}

        self.Popen.set_command("ls -la", stdout=b"testing testing 123", stderr=b"e")

        task = Command(self.project_config, self.task_config)
        task()

        self.assertTrue(any("testing testing" in s for s in self.task_log["info"]))
Example #2
0
 def set_time(self, dt):
     r = Replacer()
     r.replace(
         'testfixtures.tests.sample1.datetime',
         test_datetime(dt.year, dt.month, dt.day, dt.hour, dt.minute,
                       dt.second))
     return r
Example #3
0
 def setUp(self):
     log.setLevel('CRITICAL')
     self.Popen = MockPopen()
     replacer = Replacer()
     replacer.replace('popper.runner_host.Popen', self.Popen)
     self.addCleanup(replacer.restore)
     self.repo = tempfile.mkdtemp()
Example #4
0
 def test_replacer_del(self):
     r = Replacer()
     r.replace('testfixtures.tests.sample1.left_behind', object(), strict=False)
     with catch_warnings(record=True) as w:
         del r
         self.assertTrue(len(w), 1)
         compare(str(w[0].message), "Replacer deleted without being restored, originals left: {'testfixtures.tests.sample1.left_behind': <not_there>}")
Example #5
0
class TestCommandTaskWithMockPopen(MockLoggerMixin, unittest.TestCase):
    """ Run command tasks with a mocked popen """

    def setUp(self):
        self.global_config = BaseGlobalConfig()
        self.project_config = BaseProjectConfig(
            self.global_config, config={"noyaml": True}
        )
        self.task_config = TaskConfig()

        self._task_log_handler.reset()
        self.task_log = self._task_log_handler.messages

        self.Popen = MockPopen()
        self.r = Replacer()
        self.r.replace("cumulusci.tasks.command.subprocess.Popen", self.Popen)
        self.addCleanup(self.r.restore)

    def test_functional_mock_command(self):
        """ Functional test that runs a command with mocked
        popen results and checks the log.
        """

        self.task_config.config["options"] = {"command": "ls -la"}

        self.Popen.set_command("ls -la", stdout=b"testing testing 123", stderr=b"e")

        task = Command(self.project_config, self.task_config)
        task()

        self.assertTrue(any("testing testing" in s for s in self.task_log["info"]))
Example #6
0
    def test_cleanup_properly(self):
        r = Replacer()
        try:
            m = Mock()
            d = mkdtemp()
            m.return_value = d
            r.replace('testfixtures.tempdirectory.mkdtemp',m)

            self.failUnless(os.path.exists(d))

            self.assertFalse(m.called)
            
            @tempdir()
            def test_method(d):
                d.write('something', b'stuff')
                d.check('something', )

            self.assertFalse(m.called)
            compare(os.listdir(d),[])

            test_method()
            
            self.assertTrue(m.called)
            self.failIf(os.path.exists(d))
            
        finally:
            r.restore()
            if os.path.exists(d):
                # only runs if the test fails!
                rmtree(d) # pragma: no cover
    def test_cleanup_properly(self):
        r = Replacer()
        try:
            m = Mock()
            d = mkdtemp()
            m.return_value = d
            r.replace('testfixtures.tempdirectory.mkdtemp',m)

            self.failUnless(os.path.exists(d))

            self.assertFalse(m.called)
            
            @tempdir()
            def test_method(d):
                d.write('something', b'stuff')
                d.check('something', )

            self.assertFalse(m.called)
            compare(os.listdir(d),[])

            test_method()
            
            self.assertTrue(m.called)
            self.failIf(os.path.exists(d))
            
        finally:
            r.restore()
            if os.path.exists(d):
                # only runs if the test fails!
                rmtree(d) # pragma: no cover
Example #8
0
 def setUp(self):
     self.dir = TempDirectory()
     self.addCleanup(self.dir.cleanup)
     self.Popen = MockPopen()
     r = Replacer()
     r.replace('archivist.helpers.Popen', self.Popen)
     self.addCleanup(r.restore)
Example #9
0
class SavedSearchFormTests(TestCase):
    def setUp(self):
        super(SavedSearchFormTests, self).setUp()
        self.user = UserFactory()
        self.data = {
            'url': 'http://www.my.jobs/jobs',
            'feed': 'http://www.my.jobs/jobs/feed/rss?',
            'email': '*****@*****.**',
            'frequency': 'D',
            'label': 'All jobs from www.my.jobs',
            'sort_by': 'Relevance'
        }

        self.r = Replacer()
        self.r.replace('urllib2.urlopen', return_file)

    def tearDown(self):
        self.r.restore()

    def test_successful_form(self):
        form = SavedSearchForm(user=self.user, data=self.data)
        self.assertTrue(form.is_valid())

    def test_invalid_url(self):
        self.data['url'] = 'http://google.com'
        form = SavedSearchForm(user=self.user, data=self.data)
        self.assertFalse(form.is_valid())
        self.assertEqual(form.errors['url'][0], 'This URL is not valid.')

    def test_day_of_week(self):
        self.data['frequency'] = 'W'
        form = SavedSearchForm(user=self.user, data=self.data)
        self.assertFalse(form.is_valid())
        self.assertEqual(form.errors['day_of_week'][0],
                         'This field is required.')

        self.data['day_of_week'] = '1'
        form = SavedSearchForm(user=self.user, data=self.data)
        self.assertTrue(form.is_valid())

    def test_day_of_month(self):
        self.data['frequency'] = 'M'
        form = SavedSearchForm(user=self.user, data=self.data)
        self.assertFalse(form.is_valid())
        self.assertEqual(form.errors['day_of_month'][0],
                         'This field is required.')

        self.data['day_of_month'] = '1'
        form = SavedSearchForm(user=self.user, data=self.data)
        self.assertTrue(form.is_valid())

    def test_duplicate_url(self):
        original = SavedSearchFactory(user=self.user)
        form = SavedSearchForm(user=self.user, data=self.data)

        self.assertFalse(form.is_valid())
        self.assertEqual(form.errors['url'][0], 'URL must be unique.')
 def test_replacer_del(self):
     r = Replacer()
     r.replace('testfixtures.tests.sample1.left_behind',
               object(), strict=False)
     with catch_warnings(record=True) as w:
         del r
         self.assertTrue(len(w), 1)
         compare(str(w[0].message),
                 "Replacer deleted without being restored, ""originals left:"
                 " {'testfixtures.tests.sample1.left_behind': <not_there>}")
Example #11
0
class SourceMixin(object):
    
    def setUp(self):
        def get_source(level=''):
            return 'default_source'+str(level)
        self.r = Replacer()
        self.r.replace('configurator._api.get_source', get_source)
        self.r.replace('configurator.section.get_source', get_source)

    def tearDown(self):
        self.r.restore()
Example #12
0
 def setUp(self):
     self.Popen = MockPopen()
     replacer = Replacer()
     replacer.replace("popper.runner_host.Popen", self.Popen)
     assert_replacer = Replacer()
     assert_replacer.replace(
         "popper.runner_slurm.assert_executable_exists",
         mock_assert_executable_exists,
     )
     self.addCleanup(replacer.restore)
     self.addCleanup(assert_replacer.restore)
Example #13
0
class SavedSearchFormTests(TestCase):
    def setUp(self):
        super(SavedSearchFormTests, self).setUp()
        self.user = UserFactory()
        self.data = {'url': 'http://www.my.jobs/jobs',
                     'feed': 'http://www.my.jobs/jobs/feed/rss?',
                     'email': '*****@*****.**',
                     'frequency': 'D',
                     'label': 'All jobs from www.my.jobs',
                     'sort_by': 'Relevance'}

        self.r = Replacer()
        self.r.replace('urllib2.urlopen', return_file)

    def tearDown(self):
        self.r.restore()

    def test_successful_form(self):
        form = SavedSearchForm(user=self.user,data=self.data)
        self.assertTrue(form.is_valid())

    def test_invalid_url(self):
        self.data['url'] = 'http://google.com'
        form = SavedSearchForm(user=self.user,data=self.data)
        self.assertFalse(form.is_valid())
        self.assertEqual(form.errors['url'][0], 'This URL is not valid.')

    def test_day_of_week(self):
        self.data['frequency'] = 'W'
        form = SavedSearchForm(user=self.user,data=self.data)
        self.assertFalse(form.is_valid())
        self.assertEqual(form.errors['day_of_week'][0], 'This field is required.')

        self.data['day_of_week'] = '1'
        form = SavedSearchForm(user=self.user,data=self.data)        
        self.assertTrue(form.is_valid())

    def test_day_of_month(self):
        self.data['frequency'] = 'M'
        form = SavedSearchForm(user=self.user,data=self.data)
        self.assertFalse(form.is_valid())
        self.assertEqual(form.errors['day_of_month'][0], 'This field is required.')

        self.data['day_of_month'] = '1'
        form = SavedSearchForm(user=self.user,data=self.data)        
        self.assertTrue(form.is_valid())

    def test_duplicate_url(self):
        original = SavedSearchFactory(user=self.user)
        form = SavedSearchForm(user=self.user,data=self.data)

        self.assertFalse(form.is_valid())
        self.assertEqual(form.errors['url'][0], 'URL must be unique.')
Example #14
0
 def test_import_and_obtain_with_lists(self):
     t = test_datetime(None)
     t.add(2002, 1, 1, 1, 0, 0)
     t.add(2002, 1, 1, 2, 0, 0)
     from testfixtures import Replacer
     r = Replacer()
     r.replace('testfixtures.tests.sample1.now', t.now)
     try:
         compare(sample1.str_now_2(), '2002-01-01 01:00:00')
         compare(sample1.str_now_2(), '2002-01-01 02:00:00')
     finally:
         r.restore()
Example #15
0
 def test_import_and_obtain_with_lists(self):
     t = test_date(None)
     t.add(2002, 1, 1)
     t.add(2002, 1, 2)
     from testfixtures import Replacer
     r = Replacer()
     r.replace('testfixtures.tests.sample1.today', t.today)
     try:
         compare(sample1.str_today_2(), '2002-01-01')
         compare(sample1.str_today_2(), '2002-01-02')
     finally:
         r.restore()
Example #16
0
    def test_remove_called_twice(self):
        from testfixtures.tests import sample1

        def test_z(): pass

        r = Replacer()
        r.replace('testfixtures.tests.sample1.z',test_z)

        r.restore()
        assert sample1.z() == 'original z'

        r.restore()
        assert sample1.z() == 'original z'
 def setUp(self):
     r = Replacer()
     self.addCleanup(r.restore)
     self.mock = Mock()
     self.mock.input.return_value = 'u'
     self.mock.getpass.return_value = 'p'
     r.replace('workfront.get_api_key.input', self.mock.input)
     r.replace('getpass.getpass', self.mock.getpass)
     r.replace('logging.basicConfig', self.mock.logging)
     r.replace('sys.argv', ['x'])
     self.server = MockOpen(
         'https://api-cl01.attask-ondemand.com/attask/api/unsupported')
     r.replace('workfront.six.moves.urllib.request.urlopen', self.server)
Example #18
0
class BasicMockedPopen:
    """Class with a mocked popen for system calls.

    use self.popen.set_command(command, stdout=b'returned value')
    """
    @pytest.fixture(autouse=True)
    def mock_popen_clear_env(self):
        """Mock Popen around each test."""
        self.popen = MockPopen()
        self.replacer = Replacer()
        self.replacer.replace("universions._exec.Popen", self.popen)
        yield
        self.replacer.restore()
Example #19
0
    def test_import_and_obtain_with_lists(self):

        t = test_datetime(None)
        t.add(2002, 1, 1, 1, 0, 0)
        t.add(2002, 1, 1, 2, 0, 0)

        from testfixtures import Replacer
        r = Replacer()
        r.replace('testfixtures.tests.sample1.now', t.now)
        try:
            compare(sample1.str_now_2(), '2002-01-01 01:00:00')
            compare(sample1.str_now_2(), '2002-01-01 02:00:00')
        finally:
            r.restore()
Example #20
0
    def test_import_and_obtain_with_lists(self):

        t = test_date(None)
        t.add(2002, 1, 1)
        t.add(2002, 1, 2)

        from testfixtures import Replacer
        r = Replacer()
        r.replace('testfixtures.tests.sample1.today', t.today)
        try:
            compare(sample1.str_today_2(), '2002-01-01')
            compare(sample1.str_today_2(), '2002-01-02')
        finally:
            r.restore()
 def setUp(self):
     r = Replacer()
     self.addCleanup(r.restore)
     self.mock = Mock()
     self.mock.input.return_value = 'u'
     self.mock.getpass.return_value = 'p'
     r.replace('workfront.get_api_key.input', self.mock.input)
     r.replace('getpass.getpass', self.mock.getpass)
     r.replace('logging.basicConfig', self.mock.logging)
     r.replace('sys.argv', ['x'])
     self.server = MockOpen(
         'https://api-cl01.attask-ondemand.com/attask/api/unsupported'
     )
     r.replace('workfront.six.moves.urllib.request.urlopen', self.server)
Example #22
0
class PopenCommandsTest(unittest.TestCase):

    def setUp(self):
        self.Popen = MockPopen()
        self.r = Replacer()
        self.r.replace('swabbie.utils.command.subprocess.Popen', self.Popen)
        self.addCleanup(self.r.restore)

    def test_call_cmd(self):
        self.Popen.set_command('cmd1', stdout='foo')
        command_result = Command._call_cmd('cmd1')
        expected_command_result = CommandResult(output='foo', return_code=0)
        self.assertEqual(command_result.output, expected_command_result.output)
        self.assertEqual(command_result.return_code, expected_command_result.return_code)
        self.assertFalse(command_result.err)
Example #23
0
    def test_method(self):
        from testfixtures.tests import sample1
        assert sample1.X().y() == 'original y'

        def test_y(self):
          return 'replacement y'

        r = Replacer()
        r.replace('testfixtures.tests.sample1.X.y',test_y)

        assert sample1.X().y()[:38] == 'replacement y'

        r.restore()

        assert sample1.X().y() == 'original y'
Example #24
0
    def test_function(self):
        from testfixtures.tests import sample1
        assert sample1.z() == 'original z'

        def test_z():
          return 'replacement z'

        r = Replacer()
        r.replace('testfixtures.tests.sample1.z',test_z)

        assert sample1.z() == 'replacement z'

        r.restore()

        assert sample1.z() == 'original z'
Example #25
0
class TestCheck(TestCase):

    def setUp(self):
        self.r = Replacer()
        self.l = LogCapture()

    def tearDown(self):
        self.l.uninstall()
        self.r.restore()

    def checker_returns(self,output):
        resolve = Mock()
        self.r.replace('checker.resolve',resolve)
        def the_checker(config_folder,param):
            return output
        resolve.return_value = the_checker
        return resolve
        
    def test_bad_checker(self):
        from checker import check
        check = should_raise(check,ImportError('No module named unknown'))
        check('/config','unknown',None)

    def test_normal(self):
        m = self.checker_returns('some output')
        check('/config','achecker',None)
        compare(m.call_args_list,[
                (('checker.checkers.achecker.check',), {})
                ])

    def test_log_newline(self):
        self.checker_returns('some output\n')
        check('/config','achecker','aparam')
        self.l.check(
            ('root', 'INFO', 'some output'),
            )

    def test_log_no_newline(self):
        self.checker_returns('some output')
        check('/config','achecker','aparam')
        self.l.check(
            ('root', 'INFO', 'some output'),
            )
        
    def test_no_log_empty(self):
        self.checker_returns('')
        check('/config','achecker','aparam')
        self.l.check()
Example #26
0
    def test_class_method(self):
        from testfixtures.tests import sample1
        c = sample1.X
        assert sample1.X.aMethod() is c

        def rMethod(cls):
          return cls, 1

        r = Replacer()
        r.replace('testfixtures.tests.sample1.X.aMethod',rMethod)

        sample1.X.aMethod()
        assert sample1.X.aMethod() == (c, 1)

        r.restore()

        sample1.X.aMethod()
        assert sample1.X.aMethod() is c
Example #27
0
    def test_class(self):
        from testfixtures.tests import sample1
        x = sample1.X()
        assert x.__class__.__name__ == 'X'

        class XReplacement(sample1.X): pass

        r = Replacer()
        r.replace('testfixtures.tests.sample1.X', XReplacement)

        x = sample1.X()
        assert x.__class__.__name__ == 'XReplacement'
        assert sample1.X().y() == 'original y'

        r.restore()

        x = sample1.X()
        assert x.__class__.__name__ == 'X'
Example #28
0
class TestEditPageController(unittest.TestCase):

    def setUp(self):
        self.r = Replacer()
        self.r.replace('opencore.views.forms.get_current_request',
                       lambda: self.request)
        self.r.replace('opencore.views.forms.authenticated_userid',
                       lambda request: 'auth_user_id')

        testing.cleanUp()
        context = testing.DummyModel()
        context.title = 'title'
        context.text = 'content text'
        context.__name__ = 'my-page'
        self.context = context
        request = testing.DummyRequest()
        request.api = get_template_api(context, request)
        request.context = context
        self.request = request

    def tearDown(self):
        testing.cleanUp()
        self.r.restore()

    def _makeOne(self):
        return EditPageController(self.context, self.request)

    def test_get(self):
        controller = self._makeOne()
        info = controller()
        self.assertTrue('api' in info)
        self.assertTrue(info['form'].startswith('<form id="deform"'))

    def test_post(self):
        self.request.POST = MultiDict([
                ('title', u'New Title'),
                ('text', u'Lorem Ipsum'),
                ('save', u'save'),
                ])
        controller = self._makeOne()
        info = controller()
        self.assertEquals(self.context.title, "New Title")
        self.assertEquals(self.context.text, "Lorem Ipsum")
Example #29
0
class TestCheck(TestCase):
    def setUp(self):
        self.r = Replacer()
        self.l = LogCapture()

    def tearDown(self):
        self.l.uninstall()
        self.r.restore()

    def checker_returns(self, output):
        resolve = Mock()
        self.r.replace('checker.check.resolve', resolve)

        def the_checker(config_folder, param):
            return output

        resolve.return_value = the_checker
        return resolve

    def test_bad_checker(self):
        with ShouldRaise(ImportError('No module named unknown')):
            check('/config', 'unknown', None)

    def test_normal(self):
        m = self.checker_returns('some output')
        check('/config', 'achecker', None)
        compare(m.call_args_list,
                [(('checker.checkers.achecker.check', ), {})])

    def test_log_newline(self):
        self.checker_returns('some output\n')
        check('/config', 'achecker', 'aparam')
        self.l.check(('root', 'INFO', 'some output'), )

    def test_log_no_newline(self):
        self.checker_returns('some output')
        check('/config', 'achecker', 'aparam')
        self.l.check(('root', 'INFO', 'some output'), )

    def test_no_log_empty(self):
        self.checker_returns('')
        check('/config', 'achecker', 'aparam')
        self.l.check()
Example #30
0
class TestCheck(TestCase):
    def setUp(self):
        self.r = Replacer()
        self.l = LogCapture()

    def tearDown(self):
        self.l.uninstall()
        self.r.restore()

    def checker_returns(self, output):
        resolve = Mock()
        self.r.replace("checker.check.resolve", resolve)

        def the_checker(config_folder, param):
            return output

        resolve.return_value = the_checker
        return resolve

    def test_bad_checker(self):
        with ShouldRaise(ImportError("No module named unknown")):
            check("/config", "unknown", None)

    def test_normal(self):
        m = self.checker_returns("some output")
        check("/config", "achecker", None)
        compare(m.call_args_list, [(("checker.checkers.achecker.check",), {})])

    def test_log_newline(self):
        self.checker_returns("some output\n")
        check("/config", "achecker", "aparam")
        self.l.check(("root", "INFO", "some output"))

    def test_log_no_newline(self):
        self.checker_returns("some output")
        check("/config", "achecker", "aparam")
        self.l.check(("root", "INFO", "some output"))

    def test_no_log_empty(self):
        self.checker_returns("")
        check("/config", "achecker", "aparam")
        self.l.check()
Example #31
0
    def test_gotcha(self):
        # Just because you replace an object in one context:

        from testfixtures.tests import sample1
        from testfixtures.tests import sample2
        assert sample1.z() == 'original z'

        def test_z():
          return 'replacement z'

        r = Replacer()
        r.replace('testfixtures.tests.sample1.z',test_z)

        assert sample1.z() == 'replacement z'

        # Doesn't meant that it's replaced in all contexts:

        assert sample2.z() == 'original z'

        r.restore()
Example #32
0
class TestCommandTaskWithMockPopen(unittest.TestCase):
    """ Run command tasks with a mocked popen """
    @classmethod
    def setUpClass(cls):
        super(TestCommandTaskWithMockPopen, cls).setUpClass()
        logger = logging.getLogger(cumulusci.core.tasks.__name__)
        logger.setLevel(logging.DEBUG)
        cls._task_log_handler = MockLoggingHandler(logging.DEBUG)
        logger.addHandler(cls._task_log_handler)

    def setUp(self):
        self.global_config = BaseGlobalConfig()
        self.project_config = BaseProjectConfig(self.global_config)
        self.task_config = TaskConfig()

        self._task_log_handler.reset()
        self.task_log = self._task_log_handler.messages

        self.Popen = MockPopen()
        self.r = Replacer()
        self.r.replace('cumulusci.tasks.command.subprocess.Popen', self.Popen)
        self.addCleanup(self.r.restore)

    def test_functional_mock_command(self):
        """ Functional test that runs a command with mocked
        popen results and checks the log.
        """

        self.task_config.config['options'] = {
            'command': 'ls -la',
        }

        self.Popen.set_command('ls -la',
                               stdout=b'testing testing 123',
                               stderr=b'e')

        task = Command(self.project_config, self.task_config)
        task()

        self.assertTrue(
            any("testing testing" in s for s in self.task_log['info']))
Example #33
0
class Test_handle_photo_upload(TestCase):

    def setUp(self):
        testing.cleanUp()
        registerContentFactory(DummyImageFile,ICommunityFile)
        self.cstruct = {
            'fp': StringIO('some image data'),
            'mimetype': 'image/jpeg',
            'filename': u'test.jpg',
            }
        self.context = DummyProfile()
        self.authenticated_userid = Mock()
        self.authenticated_userid.return_value = 'auser'
        self.r = Replacer()
        self.r.replace('opencore.views.utils.authenticated_userid',
                       self.authenticated_userid)

    def tearDown(self):
        self.r.restore()
        testing.cleanUp()
        
    def test_no_cstruct(self):
        handle_photo_upload(self.context,None,None)
        self.assertFalse(self.context.get('photo'))

    def test_no_existing_photo(self):
        handle_photo_upload(self.context,None,self.cstruct)
        content = self.context['photo']
        compare(content.title,'Photo of firstname lastname')
        compare(content.mimetype,'image/jpeg')
        compare(content.filename,'test.jpg')
        compare(content.creator,'auser')

    def test_existing_photo(self):
        self.context['photo']=testing.DummyModel()
        handle_photo_upload(self.context,None,self.cstruct)
        content = self.context['photo']
        compare(content.title,'Photo of firstname lastname')
        compare(content.mimetype,'image/jpeg')
        compare(content.filename,'test.jpg')
        compare(content.creator,'auser')
Example #34
0
def _setUp(d, stdout=True):
    removeHandlers()
    DummySMTP.install(stdout=stdout)

    atexit_handlers = []
    datetime = test_datetime(2007, 1, 1, 10, delta=0)
    time = test_time(2007, 1, 1, 10, delta=0)
    r = Replacer()
    r.replace('atexit.register', atexit_handlers.append)
    r.replace('mailinglogger.MailingLogger.now', datetime.now)
    r.replace('mailinglogger.common.gethostname', Dummy('host.example.com'))
    r.replace('time.time', time)
    r.replace('os.environ.TZ', 'GMT', strict=False)
    tzset()

    d['atexit_handlers'] = atexit_handlers
    d['r'] = r
    d['smtp'] = DummySMTP
    d['datetime'] = datetime
    d['time'] = time
    d['removeHandlers'] = removeHandlers
Example #35
0
    def test_multiple_replace(self):
        from testfixtures.tests import sample1
        assert sample1.z() == 'original z'
        assert sample1.X().y() == 'original y'

        def test_y(self):
          return self.__class__.__name__
        def test_z():
          return 'replacement z'

        r = Replacer()
        r.replace('testfixtures.tests.sample1.z',test_z)
        r.replace('testfixtures.tests.sample1.X.y',test_y)

        assert sample1.z() == 'replacement z'
        assert sample1.X().y() == 'X'

        r.restore()

        assert sample1.z() == 'original z'
        assert sample1.X().y() == 'original y'
Example #36
0
def _setUp(d, stdout=True):
    removeHandlers()
    DummySMTP.install(stdout=stdout)

    atexit_handlers = []
    datetime = test_datetime(2007, 1, 1, 10, delta=0)
    time = test_time(2007, 1, 1, 10, delta=0)
    r = Replacer()
    r.replace('atexit.register', atexit_handlers.append)
    r.replace('mailinglogger.MailingLogger.now', datetime.now)
    r.replace('mailinglogger.common.gethostname', Dummy('host.example.com'))
    r.replace('time.time', time)
    r.replace('os.environ.TZ', 'GMT', strict=False)
    tzset()

    d['atexit_handlers'] = atexit_handlers
    d['r'] = r
    d['smtp'] = DummySMTP
    d['datetime'] = datetime
    d['time'] = time
    d['removeHandlers'] = removeHandlers
class TestReplacerXUnit(unittest.TestCase):
    def setUp(self):
        self.replacer = Replacer()

        self.mock_a = MagicMock()
        self.mock_b = MagicMock()

        self.replacer.replace('test_hello.RealClassA', self.mock_a)
        self.replacer.replace('test_hello.RealClassB', self.mock_b)

    def tearDown(self):
        self.replacer.restore()

    def test_mock(self):
        instance_a = RealClassA()
        instance_b = RealClassB()

        instance_a.say.return_value = 'FakeClassA'
        instance_b.say.return_value = 'FakeClassB'

        self.assertEqual(instance_a.say(), 'FakeClassA')
        self.assertEqual(instance_b.say(), 'FakeClassB')
Example #38
0
def _setUp(d):
    removeHandlers()
    DummySMTP.install()

    datetime = test_datetime(2007, 1, 1, 10, delta=0)
    time = test_time(2007, 1, 1, 10, delta=0)
    r = Replacer()
    r.replace('mailinglogger.MailingLogger.now', datetime.now)
    r.replace('mailinglogger.common.gethostname', Dummy('host.example.com'))
    r.replace('time.time', time)
    r.replace('os.environ.TZ', 'GMT', strict=False)
    tzset()

    d['r'] = r
    d['smtp'] = DummySMTP
    d['datetime'] = datetime
    d['time'] = time
    d['removeHandlers'] = removeHandlers
Example #39
0
def _setUp(test, self=None, stdout=True):
    if self is None:
        d = test.globs
    else:
        d = self.__dict__

    removeHandlers()
    DummySMTP.install(stdout=stdout)

    datetime = test_datetime(2007, 1, 1, 10, delta=0)
    time = test_time(2007, 1, 1, 10, delta=0)
    r = Replacer()
    r.replace('mailinglogger.MailingLogger.now', datetime.now)
    r.replace('mailinglogger.common.gethostname', Dummy('host.example.com'))
    r.replace('time.time', time)
    r.replace('os.environ.TZ', 'GMT', strict=False)
    tzset()

    d['r'] = r
    d['smtp'] = DummySMTP
    d['datetime'] = datetime
    d['time'] = time
    d['removeHandlers'] = removeHandlers
Example #40
0
def _setUp(test, self=None, stdout=True):
    if self is None:
        d = test.globs
    else:
        d = self.__dict__
        
    removeHandlers()
    DummySMTP.install(stdout=stdout)
    
    datetime = test_datetime(2007, 1, 1, 10, delta=0)
    time = test_time(2007, 1, 1, 10, delta=0)
    r = Replacer()
    r.replace('mailinglogger.MailingLogger.now', datetime.now)
    r.replace('mailinglogger.common.gethostname', Dummy('host.example.com'))
    r.replace('time.time', time)
    r.replace('os.environ.TZ', 'GMT', strict=False)
    tzset()

    d['r'] = r
    d['smtp']=DummySMTP
    d['datetime']=datetime
    d['time']=time
    d['removeHandlers']=removeHandlers
Example #41
0
def setUp(test, self=None, stdout=True):
    if self is None:
        d = test.globs
    else:
        d = self.__dict__

    removeHandlers()
    DummySMTP.install(stdout=stdout)

    datetime = test_datetime(2007, 1, 1, 10, delta=0)
    time = test_time(2007, 1, 1, 10, delta=0)
    r = Replacer()
    r.replace("mailinglogger.MailingLogger.now", datetime.now)
    r.replace("mailinglogger.common.gethostname", Dummy("host.example.com"))
    r.replace("time.time", time)
    r.replace("os.environ.TZ", "GMT", strict=False)
    tzset()

    d["r"] = r
    d["smtp"] = DummySMTP
    d["datetime"] = datetime
    d["time"] = time
    d["removeHandlers"] = removeHandlers
Example #42
0
 def setUp(self):
     self.popen = MockPopen()
     replacer = Replacer()
     replacer.replace('testfixtures.tests.test_popen.subprocess.Popen',
                      self.popen)
     self.addCleanup(replacer.restore)
Example #43
0
class SavedSearchHelperTests(TestCase):
    def setUp(self):
        super(SavedSearchHelperTests, self).setUp()
        self.user = UserFactory()
        self.valid_url = 'http://www.my.jobs/search?location=chicago&q=nurse'
        
        self.r = Replacer()
        self.r.replace('urllib2.urlopen', return_file)

    def tearDown(self):
        self.r.restore()
        
    def test_valid_dotjobs_url(self):
        url, soup = validate_dotjobs_url(self.valid_url)
        self.assertIsNotNone(url)
        self.assertIsNotNone(soup)

        no_netloc = 'www.my.jobs/search?location=chicago&q=nurse'
        title, url = validate_dotjobs_url(no_netloc)
        self.assertIsNotNone(title)
        self.assertIsNotNone(url)
        self.assertEquals(title, 'Jobs - nurse Jobs in Chicago')

        valid_filter_url = 'www.my.jobs/chicago/illinois/usa/jobs/mcdonalds/careers/'
        title, url = validate_dotjobs_url(valid_filter_url)
        self.assertIsNotNone(title)
        self.assertIsNotNone(url)

    def test_invalid_dotjobs_url(self):
        urls = [ 'http://google.com', # url does not contain a feed
                 '', # url not provided
                 'http://'] # invalid url provided
        for url in urls:
            title, url = validate_dotjobs_url(url)
            self.assertIsNone(title)
            self.assertIsNone(url)

    def test_date_in_range(self):
        start = datetime.date(month=1,day=1,year=2013)
        end = datetime.date(month=12,day=1,year=2013)
        x = datetime.date(month=6,day=1,year=2013)
        is_in_range = date_in_range(start, end, x)
        self.assertTrue(is_in_range)

        start = datetime.date(month=1,day=1,year=2013)
        end = datetime.date(month=12,day=1,year=2013)
        x = datetime.date(month=6,day=1,year=2010)
        is_in_range = date_in_range(start, end, x)
        self.assertFalse(is_in_range)
        
    def test_parse_rss(self):
        feed_url = 'http://www.my.jobs/feed/rss'
        items = parse_rss(feed_url)
        self.assertTrue(len(items) <= 20)

    def test_url_sort_options(self):
        feed = 'http://www.my.jobs/jobs/feed/rss?date_sort=False'

        # Test to make sure sort by "Relevance" has '&date_sort=False' added
        # a single time
        feed_url = url_sort_options(feed, "Relevance")
        parsed = urlparse(feed_url)
        query = parse_qs(parsed.query)

        self.assertEquals(parsed.path, "/jobs/feed/rss")
        self.assertEquals(query['date_sort'], [u'False'])
        int(query['days_ago'][0])
    
        # Test to make sure sort by "Date" doesn't have anything added
        feed_url = url_sort_options(feed, "Date")
        self.assertEquals(feed_url, "http://www.my.jobs/jobs/feed/rss")

    def test_unicode_in_search(self):
        search = SavedSearch(url=u"http://www.my.jobs/search?q=%E2%80%93",
                             user=self.user,
                             feed=u"http://www.my.jobs/search/feed/rss?q=%E2%80%93",
                             sort_by=u'Relevance')
        search.save()

        feed_url = url_sort_options(search.feed, search.sort_by)

        old = parse_qs(urlparse(search.feed).query)
        new = parse_qs(urlparse(feed_url).query)

        self.assertFalse(old.get('date_sort'))
        self.assertFalse(old.get('days_ago'))
        self.assertTrue(new['date_sort'][0])
        self.assertTrue(new['days_ago'][0])

        del new['date_sort']
        del new['days_ago']
        self.assertEqual(new, old)
Example #44
0
class CppInsightsTestCase(unittest.TestCase):
    def mock_mkstemp(self, suffix=None, prefix=None, dir=None, text=False):
        self.fd = open('/tmp/pyt.cpp', "w+")
        return [self.fd.fileno(), '/tmp/pyt.cpp']

    #------------------------------------------------------------------------------

    @staticmethod
    def removeDbTestFile(cls):
        if os.path.exists(cls.getDbNameMock()):
            os.remove(cls.getDbNameMock())

    #------------------------------------------------------------------------------

    @staticmethod
    def getDbNameMock():
        return 'urls_test.db'

    #------------------------------------------------------------------------------

    @classmethod
    def setUpClass(cls):
        cls.removeDbTestFile(cls)

    #------------------------------------------------------------------------------

    def setUp(self):
        self.app = app.test_client()
        self.Popen = MockPopen()
        self.r = Replacer()
        self.r.replace('subprocess.Popen', self.Popen)
        self.r.replace('tempfile.mkstemp', self.mock_mkstemp)
        self.r.replace('app.getDbName', self.getDbNameMock)
        self.addCleanup(self.r.restore)

    #------------------------------------------------------------------------------

    @classmethod
    def tearDownClass(cls):
        cls.removeDbTestFile(cls)

    #------------------------------------------------------------------------------

#    def tearDown(self):
##        if None != self.fd:
#            self.fd.close()
#        if hasattr(self, 'fd'):
#            self.fd.close()
#------------------------------------------------------------------------------

    def test_access_root(self):
        rv = self.app.get('/')
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_cpp_options_order_root(self):
        rv = self.app.get('/')
        data = rv.data.decode("utf-8").splitlines()
        opts = [
            'C++ Standard',
            'cpp98',
            'cpp11',
            'cpp14',
            'cpp17',
            'cpp2a',
            'Alternative Styles',
            'alt-syntax-for',
            'alt-syntax-subscription',
            'More Transformations',
            #                 'stdinitlist',
            'all-implicit-casts',
            'use-libcpp',
        ]

        regEx = re.compile(r'[value|label]="(.*?)"')
        regExGroup = re.compile(r'label="(.*?)"')  # optgroup label=
        options = []
        for line in data:
            line = line.strip()
            if not line.startswith('<option') and not line.startswith(
                    '<optgroup'):
                continue

            if -1 != line.find('class="fonts"'):
                continue

            m = regEx.search(line)
            if None != m:
                options.append(m.group(1))

        assert opts == options
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_invalid_site(self):
        rv = self.app.get('/aa')
        assert b'Page Not Found' in rv.data

    #------------------------------------------------------------------------------

    def test_invalid_site_with_post(self):
        rv = self.app.post('/test_function',
                           data=json.dumps(dict(foo='bar')),
                           content_type='application/json')

        assert 405 == rv.status_code

    #------------------------------------------------------------------------------

    def test_request_api_v1_tranform_valid(self):
        self.Popen.set_command(
            'sudo -u pfes docker run --net=none -v /tmp/pyt.cpp:/home/insights/insights.cpp --rm -i insights-test -- -std=c++98',
            stdout=b'o',
            stderr=b'',
            returncode=0)

        rv = self.app.post('/api/v1/transform',
                           data=json.dumps(
                               dict(insightsOptions=['cpp98'], code='hello')),
                           content_type='application/json')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)
        self.assertTrue(
            data['stderr'] == 'Insights exited with result code: 0')
        self.assertTrue(data['stdout'] == 'o')
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_request_api_v1_tranform_valid_with_result_1(self):
        self.Popen.set_command(
            'sudo -u pfes docker run --net=none -v /tmp/pyt.cpp:/home/insights/insights.cpp --rm -i insights-test -- -std=c++98',
            stdout=b'o',
            stderr=b'',
            returncode=1)

        rv = self.app.post('/api/v1/transform',
                           data=json.dumps(
                               dict(insightsOptions=['cpp98'], code='hello')),
                           content_type='application/json')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 1)
        self.assertTrue(
            data['stderr'] == 'Insights exited with result code: 1')
        self.assertTrue(data['stdout'] == 'Compilation failed!')
        assert b'Compilation failed!' in data['stdout'].encode()
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_request_api_v1_tranform_valid_with_result_and_insights_args_1(
            self):
        self.Popen.set_command(
            'sudo -u pfes docker run --net=none -v /tmp/pyt.cpp:/home/insights/insights.cpp --rm -i insights-test -alt-syntax-for -- -std=c++98',
            stdout=b'o',
            stderr=b'',
            returncode=0)

        rv = self.app.post('/api/v1/transform',
                           data=json.dumps(
                               dict(
                                   insightsOptions=['alt-syntax-for', 'cpp98'],
                                   code='hello')),
                           content_type='application/json')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)
        self.assertTrue(
            data['stderr'] == 'Insights exited with result code: 0')
        self.assertTrue(data['stdout'] == 'o')
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_request_api_v1_tranform_valid_with_warnings(self):
        self.Popen.set_command(
            'sudo -u pfes docker run --net=none -v /tmp/pyt.cpp:/home/insights/insights.cpp --rm -i insights-test -- -std=c++98',
            stdout=b'o',
            stderr=b'Warning: unused var',
            returncode=0)

        rv = self.app.post('/api/v1/transform',
                           data=json.dumps(
                               dict(insightsOptions=['cpp98'], code='hello')),
                           content_type='application/json')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)
        self.assertTrue(data['stderr'] == 'Warning: unused var')
        self.assertTrue(data['stdout'] == 'o')
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_request_api_v1_tranform_invalid_std(self):
        self.Popen.set_command(
            'sudo -u pfes docker run --net=none -v /tmp/pyt.cpp:/home/insights/insights.cpp --rm -i insights-test -- -std=c++17',
            stdout=b'o',
            stderr=b'',
            returncode=0)

        rv = self.app.post('/api/v1/transform',
                           data=json.dumps(
                               dict(insightsOptions=['cpp12'], code='hello')),
                           content_type='application/json')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)
        self.assertTrue(
            data['stderr'] == 'Insights exited with result code: 0')
        self.assertTrue(data['stdout'] == 'o')
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_request_api_v1_version(self):
        self.Popen.set_command(
            'sudo -u pfes docker run --net=none --rm -i insights-test --',
            stdout=b'o',
            stderr=b'',
            returncode=0)
        self.Popen.set_command(
            'docker images --filter=reference=insights-test --format \'{{.ID}} {{.CreatedAt}}\'',
            stdout=b'o',
            stderr=b'',
            returncode=0)
        self.Popen.set_command(
            'docker images --filter=reference=insights-test --format {{.ID}} {{.CreatedAt}}',
            stdout=b'o',
            stderr=b'',
            returncode=0)

        rv = self.app.get('/api/v1/version', content_type='application/json')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)
        self.assertTrue(
            data['stderr'] == 'Insights exited with result code: 0')
        self.assertTrue(
            data['stdout'] == 'o\nDocker image "insights-test" info: o\n')
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_request_api_v1_version_invalid(self):
        self.Popen.set_command(
            'sudo -u pfes docker run --net=none --rm -i insights-test --',
            stdout=b'o',
            stderr=b'',
            returncode=1)
        self.Popen.set_command(
            'docker images --filter=reference=insights-test --format \'{{.ID}} {{.CreatedAt}}\'',
            stdout=b'o',
            stderr=b'',
            returncode=0)
        self.Popen.set_command(
            'docker images --filter=reference=insights-test --format {{.ID}} {{.CreatedAt}}',
            stdout=b'o',
            stderr=b'',
            returncode=0)

        rv = self.app.get('/api/v1/version', content_type='application/json')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 1)
        self.assertTrue(
            data['stderr'] == 'Insights exited with result code: 1')
        assert b'Compilation failed!' in data['stdout'].encode()
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_request_api_v1_version_none_sudo(self):
        app.config['USE_SUDO'] = False
        self.Popen.set_command(
            'docker run --net=none --rm -i insights-test --',
            stdout=b'o',
            stderr=b'',
            returncode=0)
        self.Popen.set_command(
            'docker images --filter=reference=insights-test --format \'{{.ID}} {{.CreatedAt}}\'',
            stdout=b'o',
            stderr=b'',
            returncode=0)
        self.Popen.set_command(
            'docker images --filter=reference=insights-test --format {{.ID}} {{.CreatedAt}}',
            stdout=b'o',
            stderr=b'',
            returncode=0)

        rv = self.app.get('/api/v1/version', content_type='application/json')

        app.config['USE_SUDO'] = True

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)
        self.assertTrue(
            data['stderr'] == 'Insights exited with result code: 0')
        self.assertTrue(
            data['stdout'] == 'o\nDocker image "insights-test" info: o\n')
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_request_api_v1_version_none_docker(self):
        app.config['USE_DOCKER'] = False
        self.Popen.set_command('insights /tmp/pyt.cpp --',
                               stdout=b'o',
                               stderr=b'',
                               returncode=0)
        self.Popen.set_command(
            'docker images --filter=reference=insights-test --format \'{{.ID}} {{.CreatedAt}}\'',
            stdout=b'o',
            stderr=b'',
            returncode=0)
        self.Popen.set_command(
            'docker images --filter=reference=insights-test --format {{.ID}} {{.CreatedAt}}',
            stdout=b'o',
            stderr=b'',
            returncode=0)

        rv = self.app.get('/api/v1/version', content_type='application/json')

        app.config['USE_DOCKER'] = True

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)
        self.assertTrue(
            data['stderr'] == 'Insights exited with result code: 0')
        self.assertTrue(
            data['stdout'] ==
            'o\nDocker image "insights-test" info: Docker not used\n')
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_request_version(self):
        self.Popen.set_command(
            'sudo -u pfes docker run --net=none --rm -i insights-test --',
            stdout=b'fake version info from docker',
            stderr=b'',
            returncode=0)
        self.Popen.set_command(
            'docker images --filter=reference=insights-test --format \'{{.ID}} {{.CreatedAt}}\'',
            stdout=b'o',
            stderr=b'',
            returncode=0)
        self.Popen.set_command(
            'docker images --filter=reference=insights-test --format {{.ID}} {{.CreatedAt}}',
            stdout=b'o',
            stderr=b'',
            returncode=0)

        rv = self.app.get('/version')

        assert b'fake version info from docker' in rv.data
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def selectedStandard(self, cppStd, text):
        return (
            '<option value="%s" class="single"  selected="selected" >\n                %s</option>'
            % (cppStd, text)).encode()

    #------------------------------------------------------------------------------

    def test_link_rev_1_valid(self):
        rv = self.app.post(
            '/lnk?code=I2luY2x1ZGUgPGNzdGRpbz4KdGVtcGxhdGU8dHlwZW5hbWUgVT4KY2xhc3MgWAp7CnB1YmxpYzoKICAgIFgoKSAgICAgICAgICAgPSBkZWZhdWx0OwogICAgWChjb25zdCBYJiB4KSA9IGRlZmF1bHQ7CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIFgoVCYmIHgpCiAgICA6IG1Ye30KICAgIHsgfQoKcHJpdmF0ZToKICAgIFUgbVg7Cn07CgppbnQgbWFpbigpCnsKICAgIFg8aW50PiBhcnJbMl17fTsKCiAgICBmb3IoY29uc3QgWDxjb25zdCBpbnQ+JiB4IDogYXJyKSB7IH0KfQ==&std=cpp11&rev=1.0',
            follow_redirects=True)
        assert self.selectedStandard('cpp11', 'C++ 11') in rv.data
        assert b'<meta property="og:title" content="C++ Insights" />' in rv.data
        assert b'<meta property="og:description" content="#include &lt;cstdio&gt;\ntemplate&lt;typename U&gt;\nclass X\n{\npublic:\n    X()           = default;\n    X(const X&amp;" />' in rv.data
        assert b'<title>C++ Insights</title>' in rv.data

    #------------------------------------------------------------------------------

    def test_link_rev_1_invalid_std(self):
        rv = self.app.post(
            '/lnk?code=I2luY2x1ZGUgPGNzdGRpbz4KdGVtcGxhdGU8dHlwZW5hbWUgVT4KY2xhc3MgWAp7CnB1YmxpYzoKICAgIFgoKSAgICAgICAgICAgPSBkZWZhdWx0OwogICAgWChjb25zdCBYJiB4KSA9IGRlZmF1bHQ7CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIFgoVCYmIHgpCiAgICA6IG1Ye30KICAgIHsgfQoKcHJpdmF0ZToKICAgIFUgbVg7Cn07CgppbnQgbWFpbigpCnsKICAgIFg8aW50PiBhcnJbMl17fTsKCiAgICBmb3IoY29uc3QgWDxjb25zdCBpbnQ+JiB4IDogYXJyKSB7IH0KfQ==&std=cpp12&rev=1.0',
            follow_redirects=True)
        assert self.selectedStandard('cpp17', 'C++ 17') in rv.data
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_link_rev_1_missing_std(self):
        rv = self.app.post(
            '/lnk?code=I2luY2x1ZGUgPGNzdGRpbz4KdGVtcGxhdGU8dHlwZW5hbWUgVT4KY2xhc3MgWAp7CnB1YmxpYzoKICAgIFgoKSAgICAgICAgICAgPSBkZWZhdWx0OwogICAgWChjb25zdCBYJiB4KSA9IGRlZmF1bHQ7CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIFgoVCYmIHgpCiAgICA6IG1Ye30KICAgIHsgfQoKcHJpdmF0ZToKICAgIFUgbVg7Cn07CgppbnQgbWFpbigpCnsKICAgIFg8aW50PiBhcnJbMl17fTsKCiAgICBmb3IoY29uc3QgWDxjb25zdCBpbnQ+JiB4IDogYXJyKSB7IH0KfQ==&rev=1.0',
            follow_redirects=True)
        assert self.selectedStandard('cpp17', 'C++ 17') in rv.data
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_link_rev_1_missing_rev(self):
        rv = self.app.post(
            '/lnk?code=I2luY2x1ZGUgPGNzdGRpbz4KdGVtcGxhdGU8dHlwZW5hbWUgVT4KY2xhc3MgWAp7CnB1YmxpYzoKICAgIFgoKSAgICAgICAgICAgPSBkZWZhdWx0OwogICAgWChjb25zdCBYJiB4KSA9IGRlZmF1bHQ7CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIFgoVCYmIHgpCiAgICA6IG1Ye30KICAgIHsgfQoKcHJpdmF0ZToKICAgIFUgbVg7Cn07CgppbnQgbWFpbigpCnsKICAgIFg8aW50PiBhcnJbMl17fTsKCiAgICBmb3IoY29uc3QgWDxjb25zdCBpbnQ+JiB4IDogYXJyKSB7IH0KfQ==&std=cpp11',
            follow_redirects=True)
        assert self.selectedStandard('cpp17', 'C++ 17') in rv.data
        assert b'The revision of the link is invalid.' in rv.data
        assert 404 == rv.status_code

    #------------------------------------------------------------------------------

    def test_link_rev_1_invalid_rev(self):
        rv = self.app.post(
            '/lnk?code=I2luY2x1ZGUgPGNzdGRpbz4KdGVtcGxhdGU8dHlwZW5hbWUgVT4KY2xhc3MgWAp7CnB1YmxpYzoKICAgIFgoKSAgICAgICAgICAgPSBkZWZhdWx0OwogICAgWChjb25zdCBYJiB4KSA9IGRlZmF1bHQ7CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIFgoVCYmIHgpCiAgICA6IG1Ye30KICAgIHsgfQoKcHJpdmF0ZToKICAgIFUgbVg7Cn07CgppbnQgbWFpbigpCnsKICAgIFg8aW50PiBhcnJbMl17fTsKCiAgICBmb3IoY29uc3QgWDxjb25zdCBpbnQ+JiB4IDogYXJyKSB7IH0KfQ==&std=cpp11&rev=22',
            follow_redirects=True)
        assert self.selectedStandard('cpp17', 'C++ 17') in rv.data
        assert b'The revision of the link is invalid.' in rv.data
        assert 404 == rv.status_code

    #------------------------------------------------------------------------------

    def test_link_rev_1_invalid_base64(self):
        rv = self.app.post(
            '/lnk?code=I2luY2x1ZGUgPGNzdGRpbz4KdGVtcGxhdGU8dHlwZW5hbWUgVT4KY2xhc3MgWAp7CnB1YmxpYzoKICAgIFgoKSAgICAgICAgICAgPSBkZWZhdWx0OwogICAgWChjb25zdCBYJiB4KSA9IGRlZmF1bHQ7CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIFgoVCYmIHgpCiAgICA6IG1Ye30KICAgIHsgfQoKcHJpdmF0ZToKICAgIFUgbVg7Cn07CgppbnQgbWFpbigpCnsKICAgIFg8aW50PiBhcnJbMl17fTsKCiAgICBmb3IoY29uc3QgWDxjb25zdCBpbnQAAAAAAAAAAJiB4IDogYXJyKSB7IH0KfQ==&std=cpp11&rev=1.0',
            follow_redirects=True)
        assert self.selectedStandard('cpp11', 'C++ 11') in rv.data
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def getShortLink(self,
                     code,
                     std='cpp98',
                     rev='1.0',
                     opts=['alt-syntax-for'],
                     description=''):
        return self.app.post(
            '/api/v1/getshortlink',
            data=json.dumps(
                dict(options=opts,
                     code=createBase64EncodedString(code),
                     desc=createBase64EncodedString(description),
                     rev=rev,
                     std=std)),
            content_type='application/json')

    #------------------------------------------------------------------------------

    def test_create_short_link(self):
        rv = self.getShortLink('hello')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)

        shortLink = data['shortlink']

        assert None != shortLink
        assert shortLink.startswith('/s/')
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_short_link_size(self):
        rv = self.getShortLink('slzhello')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)

        shortLink = data['shortlink']

        assert None != shortLink
        assert shortLink.startswith('/s/')
        shortLink = shortLink.replace('/s/', '')
        assert len(shortLink) == 8
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_create_short_link_twice(self):
        # Request a link the first time
        rv = self.getShortLink('hellosame')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)

        shortLink = data['shortlink']

        assert None != shortLink
        assert shortLink.startswith('/s/')
        assert 200 == rv.status_code

        # Request a link for the same parameters a second time
        rv = self.getShortLink('hellosame')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 1)

        shortLink2 = data['shortlink']

        assert None != shortLink2
        assert shortLink2.startswith('/s/')
        assert 200 == rv.status_code

        assert shortLink == shortLink2

    #------------------------------------------------------------------------------

    def test_create_short_link_none_base64(self):
        rv = self.app.post('/api/v1/getshortlink',
                           data=json.dumps(
                               dict(options=['alt-syntax-for'],
                                    code='not-base64-encoded',
                                    desc='',
                                    rev='1.0',
                                    std='cpp98')),
                           content_type='application/json')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 2)

        shortLink = data['shortlink']

        assert None != shortLink
        assert 'No source' == shortLink
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_create_short_link_null(self):
        rv = self.app.post('/api/v1/getshortlink',
                           data=json.dumps(
                               dict(options=['alt-syntax-for'],
                                    code=None,
                                    rev='1.0',
                                    desc='',
                                    std='cpp98')),
                           content_type='application/json')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 2)

        shortLink = data['shortlink']

        assert None != shortLink
        assert 'No source' == shortLink
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_short_link_code_differ(self):
        # Request a link the first time
        rv = self.getShortLink('hellosamed')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)

        shortLink = data['shortlink']

        assert None != shortLink
        assert shortLink.startswith('/s/')
        assert 200 == rv.status_code

        # Request a link for 'nearly' the same parameters
        rv = self.getShortLink('bellosamed')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)

        shortLink2 = data['shortlink']

        assert None != shortLink2
        assert shortLink2.startswith('/s/')
        assert 200 == rv.status_code

        assert shortLink != shortLink2

    #------------------------------------------------------------------------------

    def test_short_link_options_differ(self):
        # Request a link the first time
        rv = self.getShortLink('cellosamed')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)

        shortLink = data['shortlink']

        assert None != shortLink
        assert shortLink.startswith('/s/')
        assert 200 == rv.status_code

        # Request a link for 'nearly' the same parameters
        rv = self.getShortLink('cellosamed', opts=['alt-syntax-subscription'])

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)

        shortLink2 = data['shortlink']

        assert None != shortLink2
        assert shortLink2.startswith('/s/')
        assert 200 == rv.status_code

        assert shortLink != shortLink2

    #------------------------------------------------------------------------------

    def test_short_link_std_differ(self):
        # Request a link the first time
        rv = self.getShortLink('mellosamed', std='cpp11')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)

        shortLink = data['shortlink']

        assert None != shortLink
        assert shortLink.startswith('/s/')
        assert 200 == rv.status_code

        # Request a link for 'nearly' the same parameters
        rv = self.getShortLink('mellosamed', std='cpp14')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)

        shortLink2 = data['shortlink']

        assert None != shortLink2
        assert shortLink2.startswith('/s/')
        assert 200 == rv.status_code

        assert shortLink != shortLink2

    #------------------------------------------------------------------------------

    def test_short_link_multiple_options(self):
        rv = self.getShortLink(createBase64EncodedString('multiple options'),
                               opts=['alt-syntax-subscription,alt-syntax-for'])

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)

        shortLink = data['shortlink']

        assert None != shortLink
        assert shortLink.startswith('/s/')
        assert 200 == rv.status_code

        rv2 = self.app.get(shortLink, follow_redirects=False)
        assert 200 == rv2.status_code
        # XXX not working
#        assert shortLink != shortLink2
#------------------------------------------------------------------------------

    def test_invalid_short_link(self):
        rv = self.app.get('/s/invalid', follow_redirects=True)

        assert 404 == rv.status_code
        assert b'// There is no such link.' in rv.data

    #------------------------------------------------------------------------------

    def test_invalid_short_link_root(self):
        rv = self.app.get('/s', follow_redirects=True)

        assert 404 == rv.status_code
        assert b'Sorry, the content your are looking for is not there.' in rv.data

    #------------------------------------------------------------------------------

    def test_create_max_length_short_link(self):
        s = 'a' * 1000000

        rv = self.app.post('/api/v1/getshortlink',
                           data=json.dumps(
                               dict(options=['alt-syntax-for'],
                                    code=createBase64EncodedString(s),
                                    rev='1.0',
                                    desc='',
                                    std='cpp98')),
                           content_type='application/json')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)

        shortLink = data['shortlink']

        assert None != shortLink
        assert shortLink.startswith('/s/')
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_create_too_long_short_link(self):
        s = 'a' * 1000001

        rv = self.getShortLink(createBase64EncodedString(s))

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 1)

        shortLink = data['shortlink']

        assert None != shortLink
        assert 'Source too long' == shortLink
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_favicon(self):
        rv = self.app.get('/favicon.ico')

        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_twitter_description_for_root(self):
        rv = self.app.get('/')

        assert b'<meta property="og:description" content="C++ Insights - See your source code with the eyes of a compiler." />' in rv.data
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_twitter_description_for_link(self):
        rv = self.app.post(
            '/lnk?code=I2luY2x1ZGUgPGNzdGRpbz4KdGVtcGxhdGU8dHlwZW5hbWUgVT4KY2xhc3MgWAp7CnB1YmxpYzoKICAgIFgoKSAgICAgICAgICAgPSBkZWZhdWx0OwogICAgWChjb25zdCBYJiB4KSA9IGRlZmF1bHQ7CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIFgoVCYmIHgpCiAgICA6IG1Ye30KICAgIHsgfQoKcHJpdmF0ZToKICAgIFUgbVg7Cn07CgppbnQgbWFpbigpCnsKICAgIFg8aW50PiBhcnJbMl17fTsKCiAgICBmb3IoY29uc3QgWDxjb25zdCBpbnQ+JiB4IDogYXJyKSB7IH0KfQ==&std=cpp11&rev=1.0',
            follow_redirects=True)
        assert b'<meta property="og:description" content="#include &lt;cstdio&gt;\ntemplate&lt;typename U&gt;\nclass X\n{\npublic:\n    X()           = default;\n    X(const X&amp;" />' in rv.data
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_twitter_description_for_short_link(self):
        rv = self.getShortLink(
            '#include <cstdio> int main() { printf("hello\n"); }')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)

        shortLink = data['shortlink']

        assert None != shortLink
        assert 200 == rv.status_code

        rv2 = self.app.get(shortLink, follow_redirects=False)

        assert 200 == rv2.status_code
        assert b'<meta property="og:description" content="#include &lt;cstdio&gt; int main() { printf(&#34;hello\n&#34;); }" />' in rv2.data

    #------------------------------------------------------------------------------

    def test_create_short_link_with_description(self):
        rv = self.getShortLink('hello with description',
                               description='A description')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)

        shortLink = data['shortlink']

        rv2 = self.app.get(shortLink, follow_redirects=False)

        assert b'<meta property="og:title" content="C++ Insights - A description" />' in rv2.data
        assert b'<meta name="description" content="C++ Insights - A description" />' in rv2.data
        assert b'<title>C++ Insights - A description</title>' in rv2.data
        assert 200 == rv2.status_code

    #------------------------------------------------------------------------------

    def test_root_description(self):
        rv = self.app.get('/', follow_redirects=False)

        assert b'<meta property="og:title" content="C++ Insights" />' in rv.data
        assert b'<meta property="og:description" content="C++ Insights - See your source code with the eyes of a compiler." />' in rv.data
        assert b'<title>C++ Insights</title>' in rv.data
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_short_link_toolid_0(self):
        rv = self.getShortLink('test for tool id')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)

        shortLink = data['shortlink']

        assert None != shortLink
        assert shortLink.startswith('/s/')
        assert 200 == rv.status_code

        conn = sqlite3.connect(self.getDbNameMock())
        c = conn.cursor()
        cur = c.execute('SELECT toolid FROM shortened WHERE short = ?',
                        (shortLink.replace('/s/', ''), ))
        rv = cur.fetchone()
        conn.close()

        assert 1 == rv[0]

    #------------------------------------------------------------------------------

    def test_get_app(self):
        import app
        rv = app.getApp()

        assert None != rv
class TestMyFunc(TestCase):
    def setUp(self):
        self.Popen = MockPopen()
        self.r = Replacer()
        self.r.replace(dotted_path, self.Popen)
        self.addCleanup(self.r.restore)

    def test_example(self):
        # set up
        self.Popen.set_command("svn ls -R foo", stdout=b"o", stderr=b"e")

        # testing of results
        compare(my_func(), b"o")

        # testing calls were in the right order and with the correct parameters:
        compare(
            [call.Popen("svn ls -R foo", shell=True, stderr=PIPE, stdout=PIPE), call.Popen_instance.communicate()],
            Popen.mock.method_calls,
        )

    def test_example_bad_returncode(self):
        # set up
        Popen.set_command("svn ls -R foo", stdout=b"o", stderr=b"e", returncode=1)

        # testing of error
        with ShouldRaise(RuntimeError("something bad happened")):
            my_func()

    def test_communicate_with_input(self):
        # setup
        Popen = MockPopen()
        Popen.set_command("a command")
        # usage
        process = Popen("a command", stdout=PIPE, stderr=PIPE, shell=True)
        out, err = process.communicate("foo")
        # test call list
        compare(
            [call.Popen("a command", shell=True, stderr=-1, stdout=-1), call.Popen_instance.communicate("foo")],
            Popen.mock.method_calls,
        )

    def test_read_from_stdout_and_stderr(self):
        # setup
        Popen = MockPopen()
        Popen.set_command("a command", stdout=b"foo", stderr=b"bar")
        # usage
        process = Popen("a command", stdout=PIPE, stderr=PIPE, shell=True)
        compare(process.stdout.read(), b"foo")
        compare(process.stderr.read(), b"bar")
        # test call list
        compare([call.Popen("a command", shell=True, stderr=PIPE, stdout=PIPE)], Popen.mock.method_calls)

    def test_wait_and_return_code(self):
        # setup
        Popen = MockPopen()
        Popen.set_command("a command", returncode=3)
        # usage
        process = Popen("a command")
        compare(process.returncode, None)
        # result checking
        compare(process.wait(), 3)
        compare(process.returncode, 3)
        # test call list
        compare([call.Popen("a command"), call.Popen_instance.wait()], Popen.mock.method_calls)

    def test_send_signal(self):
        # setup
        Popen = MockPopen()
        Popen.set_command("a command")
        # usage
        process = Popen("a command", stdout=PIPE, stderr=PIPE, shell=True)
        process.send_signal(0)
        # result checking
        compare(
            [call.Popen("a command", shell=True, stderr=-1, stdout=-1), call.Popen_instance.send_signal(0)],
            Popen.mock.method_calls,
        )

    def test_poll_until_result(self):
        # setup
        Popen = MockPopen()
        Popen.set_command("a command", returncode=3, poll_count=2)
        # example usage
        process = Popen("a command")
        while process.poll() is None:
            # you'd probably have a sleep here, or go off and
            # do some other work.
            pass
        # result checking
        compare(process.returncode, 3)
        compare(
            [
                call.Popen("a command"),
                call.Popen_instance.poll(),
                call.Popen_instance.poll(),
                call.Popen_instance.poll(),
            ],
            Popen.mock.method_calls,
        )

    def test_default_behaviour(self):
        # set up
        self.Popen.set_default(stdout=b"o", stderr=b"e")

        # testing of results
        compare(my_func(), b"o")

        # testing calls were in the right order and with the correct parameters:
        compare(
            [call.Popen("svn ls -R foo", shell=True, stderr=PIPE, stdout=PIPE), call.Popen_instance.communicate()],
            Popen.mock.method_calls,
        )
Example #46
0
class TestMyFunc(TestCase):
    def setUp(self):
        self.Popen = MockPopen()
        self.r = Replacer()
        self.r.replace(dotted_path, self.Popen)
        self.addCleanup(self.r.restore)

    def test_example(self):
        # set up
        self.Popen.set_command('svn ls -R foo', stdout=b'o', stderr=b'e')

        # testing of results
        compare(my_func(), b'o')

        # testing calls were in the right order and with the correct parameters:
        compare([
            call.Popen('svn ls -R foo', shell=True, stderr=PIPE, stdout=PIPE),
            call.Popen_instance.communicate()
        ], Popen.mock.method_calls)

    def test_example_bad_returncode(self):
        # set up
        Popen.set_command('svn ls -R foo',
                          stdout=b'o',
                          stderr=b'e',
                          returncode=1)

        # testing of error
        with ShouldRaise(RuntimeError('something bad happened')):
            my_func()

    def test_communicate_with_input(self):
        # setup
        Popen = MockPopen()
        Popen.set_command('a command')
        # usage
        process = Popen('a command', stdout=PIPE, stderr=PIPE, shell=True)
        out, err = process.communicate('foo')
        # test call list
        compare([
            call.Popen('a command', shell=True, stderr=-1, stdout=-1),
            call.Popen_instance.communicate('foo'),
        ], Popen.mock.method_calls)

    def test_read_from_stdout_and_stderr(self):
        # setup
        Popen = MockPopen()
        Popen.set_command('a command', stdout=b'foo', stderr=b'bar')
        # usage
        process = Popen('a command', stdout=PIPE, stderr=PIPE, shell=True)
        compare(process.stdout.read(), b'foo')
        compare(process.stderr.read(), b'bar')
        # test call list
        compare([
            call.Popen('a command', shell=True, stderr=PIPE, stdout=PIPE),
        ], Popen.mock.method_calls)

    def test_write_to_stdin(self):
        # setup
        Popen = MockPopen()
        Popen.set_command('a command')
        # usage
        process = Popen('a command', stdin=PIPE, shell=True)
        process.stdin.write('some text')
        process.stdin.close()
        # test call list
        compare([
            call.Popen('a command', shell=True, stdin=PIPE),
            call.Popen_instance.stdin.write('some text'),
            call.Popen_instance.stdin.close(),
        ], Popen.mock.method_calls)

    def test_wait_and_return_code(self):
        # setup
        Popen = MockPopen()
        Popen.set_command('a command', returncode=3)
        # usage
        process = Popen('a command')
        compare(process.returncode, None)
        # result checking
        compare(process.wait(), 3)
        compare(process.returncode, 3)
        # test call list
        compare([
            call.Popen('a command'),
            call.Popen_instance.wait(),
        ], Popen.mock.method_calls)

    def test_send_signal(self):
        # setup
        Popen = MockPopen()
        Popen.set_command('a command')
        # usage
        process = Popen('a command', stdout=PIPE, stderr=PIPE, shell=True)
        process.send_signal(0)
        # result checking
        compare([
            call.Popen('a command', shell=True, stderr=-1, stdout=-1),
            call.Popen_instance.send_signal(0),
        ], Popen.mock.method_calls)

    def test_poll_until_result(self):
        # setup
        Popen = MockPopen()
        Popen.set_command('a command', returncode=3, poll_count=2)
        # example usage
        process = Popen('a command')
        while process.poll() is None:
            # you'd probably have a sleep here, or go off and
            # do some other work.
            pass
        # result checking
        compare(process.returncode, 3)
        compare([
            call.Popen('a command'),
            call.Popen_instance.poll(),
            call.Popen_instance.poll(),
            call.Popen_instance.poll(),
        ], Popen.mock.method_calls)

    def test_default_behaviour(self):
        # set up
        self.Popen.set_default(stdout=b'o', stderr=b'e')

        # testing of results
        compare(my_func(), b'o')

        # testing calls were in the right order and with the correct parameters:
        compare([
            call.Popen('svn ls -R foo', shell=True, stderr=PIPE, stdout=PIPE),
            call.Popen_instance.communicate()
        ], Popen.mock.method_calls)
class TestGetBase(TestCase):

    def setUp(self):
        self.r = Replacer()

    def tearDown(self):
        self.r.restore()
        
    def test_first_call(self):
        self.r.replace('mortar_rdb._bases',{})
        b1 = declarative_base()
        b2 = declarative_base()
        self.assertTrue(isinstance(b1,DeclarativeMeta))
        self.assertTrue(b1 is b2)

    def test_existing_base(self):
        base = object()
        self.r.replace('mortar_rdb._bases',{():base})
        self.assertTrue(base is declarative_base())

    def test_arguments(self):
        # the first parameter to declarative_base :-)
        engine = object()
        if PY2:
            text = 'declarative_base() takes exactly 0 arguments (1 given)'
        else:
            text = 'declarative_base() takes 0 positional arguments but 1 was given'

        with ShouldRaise(TypeError(text)):
            declarative_base(engine)

    def test_parameters_engine(self):
        engine = create_engine('sqlite://')

        b1 = declarative_base(bind=engine)
        b2 = declarative_base(bind=engine)

        self.assertTrue(b1 is b2)
        self.assertTrue(b1.metadata.bind is engine)
        self.assertTrue(b2.metadata.bind is engine)
    
    def test_parameters_metadata(self):
        metadata = MetaData()

        b1 = declarative_base(metadata=metadata)
        b2 = declarative_base(metadata=metadata)

        self.assertTrue(b1 is b2)
        self.assertTrue(b1.metadata is metadata)
        self.assertTrue(b2.metadata is metadata)
    
    def test_parameters_metaclass(self):
        class MyMeta(DeclarativeMeta):
            pass

        b1 = declarative_base(metaclass=MyMeta)
        b2 = declarative_base(metaclass=MyMeta)

        self.assertTrue(b1 is b2)
        self.assertTrue(isinstance(b1,MyMeta))
        self.assertTrue(isinstance(b2,MyMeta))

    def test_different_bases(self):
        engine = create_engine('sqlite://')
        metadata = MetaData()
        class MyMeta(DeclarativeMeta):
            pass

        b1 = declarative_base(bind=engine)
        b2 = declarative_base(metadata=metadata)
        b3 = declarative_base(metaclass=MyMeta)

        self.assertFalse(b1 is b2)
        self.assertFalse(b1 is b3)
        self.assertFalse(b2 is b3)

        self.assertTrue(b1.metadata.bind is engine)
        self.assertFalse(b2.metadata.bind is engine)
        self.assertFalse(b3.metadata.bind is engine)
        
        self.assertFalse(b1.metadata is metadata)
        self.assertTrue(b2.metadata is metadata)
        self.assertFalse(b3.metadata is metadata)

        self.assertFalse(isinstance(b1,MyMeta))
        self.assertFalse(isinstance(b2,MyMeta))
        self.assertTrue(isinstance(b3,MyMeta))
class BackupManagerTestCase(unittest.TestCase):
    def create_def_backup_obj(self):
        self.args = {
            'host':'localhost',
            'src':os.path.join(os.getcwd(), 'test_src'),
            'dest':os.path.join(os.getcwd(), 'test_dest'),
            'num_backups':2,
            'printer':backup_printer(),
            # To debug tests, this will print all commands etc to stdout
            #'printer':backup_printer(sys.stdout, sys.stdout, sys.stdout,
            #    sys.stdout, sys.stdout),
        }
        self.bm = backup_manager(**self.args)

    # Create random/named files
    def create_random_files(self, dest, num=5):
        for i in range(num):
            with open(os.path.join(dest, 'rand_{}'.format(i)), 'w+b') as f:
                f.write(bytes([random.randrange(256) for j in range(4096)]))
    def create_named_files(self, dest, files):
        for i in files:
            with open(os.path.join(dest, i), 'w+b') as f:
                f.write(bytes([random.randrange(256) for j in range(4096)]))

    # Create/cleanup a source directory with a few random files to test with
    def create_test_src_dir(self, dest=None, rand_files=5):
        if dest is None: dest = self.bm.src
        os.mkdir(dest)
        self.create_random_files(dest, num=rand_files)
    def cleanup_test_src_dir(self):
        if os.access(self.bm.src, os.F_OK):
            shutil.rmtree(self.bm.src)

    # Create/cleanup a destination directory, possibly with some junk in there
    # to start with
    def create_test_dest_dir(self, dest=None, named_files=[], rand_files=0):
        if dest is None: dest = self.bm.dest
        os.mkdir(dest)
        self.create_random_files(dest, rand_files)
        self.create_named_files(dest, named_files)
    def cleanup_test_dest_dir(self):
        if os.access(self.bm.dest, os.F_OK):
            if not os.access(self.bm.dest, os.W_OK):
                os.chmod(self.bm.dest, 777)
            shutil.rmtree(self.bm.dest)

    # Check a specific backup dir
    def check_backup_dir(self, backup_dir):
        backup_dir = os.path.join(self.bm.dest, backup_dir)
        ret = os.listdir(backup_dir)
        self.assertIn(os.path.basename(self.bm.src), ret)
        ret = sorted(os.listdir(os.path.join(backup_dir, self.bm.src)))
        self.assertEqual(ret,
            ['rand_0','rand_1','rand_2','rand_3','rand_4',]
        )

    # Mocks/restores the datetime object used by backup_manager
    def replace_datetime(self, dl=1):
        self.rp_datetime = Replacer()
        self.rp_datetime.replace('backup.BackupManager.datetime',
            test_datetime(2015, 1, 1, 12, 0, 0, delta=dl))
    def restore_datetime(self):
        self.rp_datetime.restore()
Example #49
0
class SavedSearchResourceTests(TestCase):
    def setUp(self):
        super(SavedSearchResourceTests, self).setUp()
        self.user = UserFactory()
        self.client = TestClient()
        self.data = {'email':'*****@*****.**', 'url':'www.my.jobs/jobs'}
        create_api_key(User, instance=self.user, created=True)

        self.credentials = (self.user.email, self.user.api_key.key)

        self.r = Replacer()
        self.r.replace('urllib2.urlopen', return_file)

    def tearDown(self):
        self.r.restore()

    def make_response(self, data):
        """
        The tests in this section use the following block of code a lot. This
        makes it somewhat easier to make modifications if something must change

        Inputs:
        :data: dict containing the data to be posted to the saved search api
            endpoint
        :credentials: api user's email and api key; used to authenticate the
            transaction
        """
        url = '/api/v1/savedsearch/'
        response = self.client.get(url, data)
        return response

    def test_new_search_existing_user(self):
        for data in [('*****@*****.**', 'www.my.jobs/search?q=django'),
                     ('*****@*****.**', 'www.my.jobs/search?q=python')]:
            self.data['email'] = data[0]
            self.data['url'] = data[1]
            self.data['username'] = self.user.email
            self.data['api_key'] = self.user.api_key.key
            response = self.make_response(self.data)
            self.assertEqual(response.status_code, 200)
            search = SavedSearch.objects.all()[0]
            self.assertEqual(search.user, self.user)
            content = json.loads(response.content)
            self.assertEqual(len(content), 3)
            self.assertTrue(content['new_search'])
        self.assertEqual(SavedSearch.objects.filter(user=self.user).count(), 2)

        self.data['url'] = 'http://www.my.jobs/jobs'
        response = self.make_response(self.data)

        for search in SavedSearch.objects.all():
            self.assertTrue('www.my.jobs' in search.notes)

    def test_new_search_new_user(self):
        self.data['email'] = '*****@*****.**'
        self.data['username'] = self.user.email
        self.data['api_key'] = self.user.api_key.key
        response = self.make_response(self.data)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(SavedSearch.objects.count(), 0)
        self.assertEqual(User.objects.count(), 1)
        content = json.loads(response.content)
        self.assertEqual(content['email'], 'No user with email %s exists' % \
                                   self.data['email'])
        self.assertEqual(len(content), 1)

    def test_new_search_secondary_email(self):
        SecondaryEmail.objects.create(user=self.user,
                                      email='*****@*****.**')
        self.data['email'] = '*****@*****.**'
        self.data['username'] = self.user.email
        self.data['api_key'] = self.user.api_key.key
        response = self.make_response(self.data)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(SavedSearch.objects.count(), 1)
        self.assertEqual(User.objects.count(), 1)
        search = SavedSearch.objects.all()[0]
        self.assertEqual(search.user, self.user)
        self.assertEqual(search.email, '*****@*****.**')
        content = json.loads(response.content)
        self.assertEqual(len(content), 3)

    def test_new_search_invalid_url(self):
        self.data['url'] = 'google.com'
        self.data['username'] = self.user.email
        self.data['api_key'] = self.user.api_key.key
        response = self.make_response(self.data)
        self.assertEqual(response.status_code, 200)
        content = json.loads(response.content)
        self.assertEqual(len(content), 1)
        self.assertEqual(content['url'], 'This is not a valid .JOBS feed')
        self.assertEqual(SavedSearch.objects.count(), 0)

    def test_new_search_no_url(self):
        del self.data['url']
        self.data['username'] = self.user.email
        self.data['api_key'] = self.user.api_key.key
        response = self.make_response(self.data)
        self.assertEqual(response.status_code, 200)
        content = json.loads(response.content)
        self.assertEqual(len(content), 1)
        self.assertEqual(content['url'], 'No .JOBS feed provided')
        self.assertEqual(SavedSearch.objects.count(), 0)

    def test_no_email(self):
        del self.data['email']
        self.data['username'] = self.user.email
        self.data['api_key'] = self.user.api_key.key
        response = self.make_response(self.data)
        self.assertEqual(response.status_code, 200)
        content = json.loads(response.content)
        self.assertEqual(len(content), 1)
        self.assertEqual(content['email'], 'No email provided')
        self.assertEqual(SavedSearch.objects.count(), 0)

    def test_no_auth(self):
        response = self.make_response(self.data)
        self.assertEqual(response.status_code, 401)
        self.assertEqual(response.content, '')
        self.assertEqual(SavedSearch.objects.count(), 0)

    def test_invalid_auth(self):
        headers = [(self.user.email, 'invalid_key'),
                   ('*****@*****.**', self.user.api_key.key),
                   ('*****@*****.**', 'invalid_key')]

        for header in headers:
            self.data['username'] = header[0]
            self.data['api_key'] = header[1]
            response = self.make_response(self.data)
            self.assertEqual(response.status_code, 401)
            self.assertEqual(response.content, '')
            self.assertEqual(SavedSearch.objects.count(), 0)

    def test_existing_search(self):
        self.data['username'] = self.user.email
        self.data['api_key'] = self.user.api_key.key
        response = self.make_response(self.data)
        self.assertEqual(response.status_code, 200)
        content = json.loads(response.content)
        self.assertEqual(content['new_search'], True)


        for email in [self.user.email, self.user.email.upper()]:
            self.data['email'] = email
            response = self.make_response(self.data)
            content = json.loads(response.content)
            self.assertEqual(len(content), 3)
            self.assertFalse(content['new_search'])
        self.assertEqual(SavedSearch.objects.count(), 1)
Example #50
0
class EmailForwardTests(TestCase):
    def setUp(self):
        self.redirect_guid = JOB['guid']
        self.redirect = RedirectFactory(buid=JOB['buid'],
                                        guid='{%s}' %
                                             uuid.UUID(self.redirect_guid))

        self.password = '******'
        self.user = User.objects.create(email='*****@*****.**')
        self.user.set_password(self.password)
        self.user.save()

        self.contact = CompanyEmail.objects.create(
            buid=self.redirect.buid,
            email=self.user.email)

        self.email = self.user.email.replace('@', '%40')
        self.auth = {
            'bad': [
                '',
                'Basic %s' % base64.b64encode('bad%40email:wrong_pass')],
            'good':
                'Basic %s' % base64.b64encode('%s:%s' % (self.user.email.\
                                                         replace('@', '%40'),
                                                         self.password))}
        self.post_dict = {'to': '*****@*****.**',
                          'from': '*****@*****.**',
                          'text': 'This address does not contain a valid guid',
                          'html': '',
                          'subject': 'Bad Email',
                          'attachments': 0}

        self.r = Replacer()
        self.r.replace('pysolr.Solr.search', mock_search)

    def tearDown(self):
        self.r.restore()

    def submit_email(self, use_data=True):
        """
        Helper method for submitting parsed emails. Ensures that the request
        returns a status of 200.

        Inputs:
        :use_data: Should we include post data; Default: True

        Outputs:
        :response: HttpResponse from email redirect view
        """
        auth = self.auth.get('good')
        kwargs = {'HTTP_AUTHORIZATION': auth}
        if use_data:
            kwargs['data'] = self.post_dict
        response = self.client.post(reverse('email_redirect'),
                                    **kwargs)
        self.assertEqual(response.status_code, 200)

        return response

    def assert_guid_email_responses_are_correct(self,
                                                redirect,
                                                job=None):
        """
        Helper method for validating parsed [email protected] emails.

        Inputs:
        :redirect: Redirect instance to use if a job is old
        :job: Solr result for a new job
        """
        email = mail.outbox.pop(0)
        self.assertEqual(email.from_email,
                         settings.DEFAULT_FROM_EMAIL)
        self.assertEqual(email.to, [self.post_dict['from']])
        self.assertEqual(email.subject, self.post_dict['subject'])

        # Emails turn lots of characters into HTML entities. Results from
        # Solr and the database do not. Unescape the email body so we can
        # compare the two.
        parser = HTMLParser.HTMLParser()
        body = parser.unescape(email.body)
        if job is not None:
            self.assertTrue(markdown.markdown(job['description']) in body)
        else:
            self.assertTrue(redirect.job_title in body)

    def test_jira_login(self):
        jira = JIRA(options=settings.JIRA_OPTIONS,
                    basic_auth=settings.JIRA_AUTH)
        self.assertIsNotNone(jira)

    def test_bad_authorization(self):
        for auth in self.auth.get('bad'):
            kwargs = {}
            if auth:
                # auth_value has a value, so we can pass an HTTP_AUTHORIZATION
                #    header
                kwargs['HTTP_AUTHORIZATION'] = auth
            response = self.client.post(reverse('email_redirect'),
                                        **kwargs)
            self.assertTrue(response.status_code, 403)

    def test_good_authorization(self):
        self.submit_email(use_data=False)

    def test_bad_email(self):
        self.submit_email()

        self.assertEqual(len(mail.outbox), 0)

    def test_bad_guid_email(self):
        self.post_dict['to'] = '*****@*****.**' % ('1'*32)
        self.post_dict['text'] = 'This address is not in the database'

        self.submit_email()

        email = mail.outbox.pop()
        self.assertEqual(email.subject, 'Email forward failure')
        self.assertTrue('There is no job associated with this address'
                        in email.body)

    def test_good_guid_email_new_job(self):
        self.post_dict['to'] = ['*****@*****.**' % self.redirect_guid]
        self.post_dict['text'] = 'Questions about stuff and things'
        self.post_dict['subject'] = 'Email forward success'

        self.submit_email()
        self.assert_guid_email_responses_are_correct(self.redirect, JOB)

    def test_good_guid_email_new_job_no_user(self):
        self.contact.delete()

        self.post_dict['to'] = ['*****@*****.**' % self.redirect_guid]
        self.post_dict['text'] = 'Questions about stuff and things'
        self.post_dict['subject'] = 'Email forward success'

        self.submit_email()
        self.assert_guid_email_responses_are_correct(self.redirect, JOB)

    def test_good_guid_email_old_job(self):
        guid = '1'*32
        redirect = RedirectFactory(guid='{%s}' % uuid.UUID(guid),
                                   buid=self.redirect.buid,
                                   uid=1)
        self.post_dict['to'] = ['*****@*****.**' % guid]
        self.post_dict['text'] = 'Questions about stuff and things'
        self.post_dict['subject'] = 'Email forward success'

        self.submit_email()
        self.assert_guid_email_responses_are_correct(redirect)

    def test_good_guid_email_old_job_no_user(self):
        self.contact.delete()

        guid = '1'*32
        redirect = RedirectFactory(guid='{%s}' % uuid.UUID(guid),
                                   buid=self.redirect.buid,
                                   uid=1)
        self.post_dict['to'] = ['*****@*****.**' % guid]
        self.post_dict['text'] = 'Questions about stuff and things'
        self.post_dict['subject'] = 'Email forward success'

        self.submit_email()
        self.assert_guid_email_responses_are_correct(redirect)

    def test_email_with_name(self):
        self.post_dict['to'] = 'User <*****@*****.**>' % self.redirect_guid
        self.post_dict['text'] = 'Questions about stuff and things'
        self.post_dict['subject'] = 'Email forward success'

        self.submit_email()

        email = mail.outbox.pop()

    def test_no_emails(self):
        self.post_dict.pop('to')

        self.submit_email()

        self.assertEqual(len(mail.outbox), 0)

    def test_too_many_emails(self):
        self.post_dict['to'] = '[email protected], [email protected]'

        self.submit_email()

        self.assertEqual(len(mail.outbox), 0)

    def test_prm_email(self):
        """
        If [email protected] is included as a recipient, we repost this email to
        My.jobs. This is a straight post, which we don't want to do in a
        testing environment. If we receive a 200 status code and no emails
        were sent, this was reasonably likely to have completed successfully.
        """
        prm_list = ['*****@*****.**', '*****@*****.**']

        for email in prm_list:
            # SendGrid adds [email protected] to the 'envelope' JSON string
            # if it appears as a BCC
            self.post_dict['envelope'] = '{"to":["%s"]}' % email

            response = self.submit_email()
            self.assertEqual(response.content, 'reposted')
            self.assertEqual(len(mail.outbox), 0)

        del self.post_dict['envelope']

        for email in prm_list:
            self.post_dict['to'] = email

            response = self.submit_email()
            self.assertEqual(response.content, 'reposted')
            self.assertEqual(len(mail.outbox), 0)
Example #51
0
class CppInsightsTestCase(unittest.TestCase):
    def mock_mkstemp(self, suffix=None, prefix=None, dir=None, text=False):
        self.fd = open('/tmp/pyt.cpp', "w+")
        return [self.fd.fileno(), '/tmp/pyt.cpp']

    #------------------------------------------------------------------------------

    def setUp(self):
        self.app = app.test_client()
        self.Popen = MockPopen()
        self.r = Replacer()
        self.r.replace('subprocess.Popen', self.Popen)
        self.r.replace('tempfile.mkstemp', self.mock_mkstemp)
        self.addCleanup(self.r.restore)

    #------------------------------------------------------------------------------


#    def tearDown(self):
#------------------------------------------------------------------------------

    def test_access_root(self):
        rv = self.app.get('/')
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_invalid_site(self):
        rv = self.app.get('/aa')
        assert b'Page Not Found' in rv.data

    #------------------------------------------------------------------------------

    def test_invalid_site_with_post(self):
        rv = self.app.post('/test_function',
                           data=json.dumps(dict(foo='bar')),
                           content_type='application/json')

        assert 405 == rv.status_code

    #------------------------------------------------------------------------------

    def test_request_api_v1_tranform_valid(self):
        self.Popen.set_command(
            'sudo -u pfes docker run --net=none -v /tmp/pyt.cpp:/home/insights/insights.cpp --rm -i insights-test -std=c++98',
            stdout=b'o',
            stderr=b'',
            returncode=0)

        rv = self.app.post('/api/v1/transform',
                           data=json.dumps(dict(cppStd='cpp98', code='hello')),
                           content_type='application/json')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)
        self.assertTrue(
            data['stderr'] == 'Insights exited with result code: 0')
        self.assertTrue(data['stdout'] == 'o')
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_request_api_v1_tranform_valid_with_result_1(self):
        self.Popen.set_command(
            'sudo -u pfes docker run --net=none -v /tmp/pyt.cpp:/home/insights/insights.cpp --rm -i insights-test -std=c++98',
            stdout=b'o',
            stderr=b'',
            returncode=1)

        rv = self.app.post('/api/v1/transform',
                           data=json.dumps(dict(cppStd='cpp98', code='hello')),
                           content_type='application/json')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 1)
        self.assertTrue(
            data['stderr'] == 'Insights exited with result code: 1')
        self.assertTrue(data['stdout'] == 'Compilation failed!')
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_request_api_v1_tranform_valid_with_warnings(self):
        self.Popen.set_command(
            'sudo -u pfes docker run --net=none -v /tmp/pyt.cpp:/home/insights/insights.cpp --rm -i insights-test -std=c++98',
            stdout=b'o',
            stderr=b'Warning: unused var',
            returncode=0)

        rv = self.app.post('/api/v1/transform',
                           data=json.dumps(dict(cppStd='cpp98', code='hello')),
                           content_type='application/json')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)
        self.assertTrue(data['stderr'] == 'Warning: unused var')
        self.assertTrue(data['stdout'] == 'o')
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_request_api_v1_tranform_invalid_std(self):
        self.Popen.set_command(
            'sudo -u pfes docker run --net=none -v /tmp/pyt.cpp:/home/insights/insights.cpp --rm -i insights-test -std=c++17',
            stdout=b'o',
            stderr=b'',
            returncode=0)

        rv = self.app.post('/api/v1/transform',
                           data=json.dumps(dict(cppStd='cpp12', code='hello')),
                           content_type='application/json')

        data = json.loads(rv.data.decode('utf-8'))
        self.assertTrue(data['returncode'] == 0)
        self.assertTrue(
            data['stderr'] == 'Insights exited with result code: 0')
        self.assertTrue(data['stdout'] == 'o')
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_link_rev_1_valid(self):
        rv = self.app.post(
            '/lnk?code=I2luY2x1ZGUgPGNzdGRpbz4KdGVtcGxhdGU8dHlwZW5hbWUgVT4KY2xhc3MgWAp7CnB1YmxpYzoKICAgIFgoKSAgICAgICAgICAgPSBkZWZhdWx0OwogICAgWChjb25zdCBYJiB4KSA9IGRlZmF1bHQ7CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIFgoVCYmIHgpCiAgICA6IG1Ye30KICAgIHsgfQoKcHJpdmF0ZToKICAgIFUgbVg7Cn07CgppbnQgbWFpbigpCnsKICAgIFg8aW50PiBhcnJbMl17fTsKCiAgICBmb3IoY29uc3QgWDxjb25zdCBpbnQ+JiB4IDogYXJyKSB7IH0KfQ==&std=cpp11&rev=1.0',
            follow_redirects=True)
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_link_rev_1_missing_std(self):
        rv = self.app.post(
            '/lnk?code=I2luY2x1ZGUgPGNzdGRpbz4KdGVtcGxhdGU8dHlwZW5hbWUgVT4KY2xhc3MgWAp7CnB1YmxpYzoKICAgIFgoKSAgICAgICAgICAgPSBkZWZhdWx0OwogICAgWChjb25zdCBYJiB4KSA9IGRlZmF1bHQ7CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIFgoVCYmIHgpCiAgICA6IG1Ye30KICAgIHsgfQoKcHJpdmF0ZToKICAgIFUgbVg7Cn07CgppbnQgbWFpbigpCnsKICAgIFg8aW50PiBhcnJbMl17fTsKCiAgICBmb3IoY29uc3QgWDxjb25zdCBpbnQ+JiB4IDogYXJyKSB7IH0KfQ==&std=cpp12&rev=1.0',
            follow_redirects=True)
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_link_rev_1_invalid_std(self):
        rv = self.app.post(
            '/lnk?code=I2luY2x1ZGUgPGNzdGRpbz4KdGVtcGxhdGU8dHlwZW5hbWUgVT4KY2xhc3MgWAp7CnB1YmxpYzoKICAgIFgoKSAgICAgICAgICAgPSBkZWZhdWx0OwogICAgWChjb25zdCBYJiB4KSA9IGRlZmF1bHQ7CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIFgoVCYmIHgpCiAgICA6IG1Ye30KICAgIHsgfQoKcHJpdmF0ZToKICAgIFUgbVg7Cn07CgppbnQgbWFpbigpCnsKICAgIFg8aW50PiBhcnJbMl17fTsKCiAgICBmb3IoY29uc3QgWDxjb25zdCBpbnQ+JiB4IDogYXJyKSB7IH0KfQ==&rev=1.0',
            follow_redirects=True)
        assert 200 == rv.status_code

    #------------------------------------------------------------------------------

    def test_link_rev_1_missing_rev(self):
        rv = self.app.post(
            '/lnk?code=I2luY2x1ZGUgPGNzdGRpbz4KdGVtcGxhdGU8dHlwZW5hbWUgVT4KY2xhc3MgWAp7CnB1YmxpYzoKICAgIFgoKSAgICAgICAgICAgPSBkZWZhdWx0OwogICAgWChjb25zdCBYJiB4KSA9IGRlZmF1bHQ7CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIFgoVCYmIHgpCiAgICA6IG1Ye30KICAgIHsgfQoKcHJpdmF0ZToKICAgIFUgbVg7Cn07CgppbnQgbWFpbigpCnsKICAgIFg8aW50PiBhcnJbMl17fTsKCiAgICBmb3IoY29uc3QgWDxjb25zdCBpbnQ+JiB4IDogYXJyKSB7IH0KfQ==&std=cpp11',
            follow_redirects=True)
        assert 404 == rv.status_code

    #------------------------------------------------------------------------------

    def test_link_rev_1_invalid_base64(self):
        rv = self.app.post(
            '/lnk?code=I2luY2x1ZGUgPGNzdGRpbz4KdGVtcGxhdGU8dHlwZW5hbWUgVT4KY2xhc3MgWAp7CnB1YmxpYzoKICAgIFgoKSAgICAgICAgICAgPSBkZWZhdWx0OwogICAgWChjb25zdCBYJiB4KSA9IGRlZmF1bHQ7CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIFgoVCYmIHgpCiAgICA6IG1Ye30KICAgIHsgfQoKcHJpdmF0ZToKICAgIFUgbVg7Cn07CgppbnQgbWFpbigpCnsKICAgIFg8aW50PiBhcnJbMl17fTsKCiAgICBmb3IoY29uc3QgWDxjb25zdCBpbnQAAAAAAAAAAJiB4IDogYXJyKSB7IH0KfQ==&std=cpp11&rev=1.0',
            follow_redirects=True)
        assert 200 == rv.status_code
Example #52
0
class TestMyFunc(TestCase):
    def setUp(self):
        self.Popen = MockPopen()
        self.r = Replacer()
        self.r.replace(dotted_path, self.Popen)
        self.addCleanup(self.r.restore)

    def test_example(self):
        self.Popen.set_command('svn ls -R foo', stdout='o', stderr='e')
        compare(my_func(), 'o')
        compare([
            call.Popen('svn ls -R foo', shell=True, stderr=PIPE, stdout=PIPE),
            call.Popen_instance.communicate()
        ], Popen.mock.method_calls)

    def test_example_bad_returncode(self):
        Popen.set_command('svn ls -R foo',
                          stdout='o',
                          stderr='e',
                          returncode=1)
        with ShouldRaise(RuntimeError('something bad happened')):
            my_func()

    def test_communicate_with_input(self):
        Popen = MockPopen()
        Popen.set_command('a command')
        process = Popen('a command', stdout=PIPE, stderr=PIPE, shell=True)
        out, err = process.communicate('foo')
        compare([
            call.Popen('a command', shell=True, stderr=-1, stdout=-1),
            call.Popen_instance.communicate('foo')
        ], Popen.mock.method_calls)

    def test_read_from_stdout_and_stderr(self):
        Popen = MockPopen()
        Popen.set_command('a command', stdout='foo', stderr='bar')
        process = Popen('a command', stdout=PIPE, stderr=PIPE, shell=True)
        compare(process.stdout.read(), 'foo')
        compare(process.stderr.read(), 'bar')
        compare(
            [call.Popen('a command', shell=True, stderr=PIPE, stdout=PIPE)],
            Popen.mock.method_calls)

    def test_wait_and_return_code(self):
        Popen = MockPopen()
        Popen.set_command('a command', returncode=3)
        process = Popen('a command')
        compare(process.returncode, None)
        compare(process.wait(), 3)
        compare(process.returncode, 3)
        compare([call.Popen('a command'),
                 call.Popen_instance.wait()], Popen.mock.method_calls)

    def test_send_signal(self):
        Popen = MockPopen()
        Popen.set_command('a command')
        process = Popen('a command', stdout=PIPE, stderr=PIPE, shell=True)
        process.send_signal(0)
        compare([
            call.Popen('a command', shell=True, stderr=-1, stdout=-1),
            call.Popen_instance.send_signal(0)
        ], Popen.mock.method_calls)

    def test_poll_until_result(self):
        Popen = MockPopen()
        Popen.set_command('a command', returncode=3, poll_count=2)
        process = Popen('a command')
        while process.poll() is None:
            pass

        compare(process.returncode, 3)
        compare([
            call.Popen('a command'),
            call.Popen_instance.poll(),
            call.Popen_instance.poll(),
            call.Popen_instance.poll()
        ], Popen.mock.method_calls)
Example #53
0
class SavedSearchHelperTests(TestCase):
    def setUp(self):
        super(SavedSearchHelperTests, self).setUp()
        self.user = UserFactory()
        self.valid_url = 'http://www.my.jobs/search?location=chicago&q=nurse'

        self.r = Replacer()
        self.r.replace('urllib2.urlopen', return_file)

    def tearDown(self):
        self.r.restore()

    def test_valid_dotjobs_url(self):
        url, soup = validate_dotjobs_url(self.valid_url)
        self.assertIsNotNone(url)
        self.assertIsNotNone(soup)

        no_netloc = 'www.my.jobs/search?location=chicago&q=nurse'
        title, url = validate_dotjobs_url(no_netloc)
        self.assertIsNotNone(title)
        self.assertIsNotNone(url)
        self.assertEquals(title, 'Jobs - nurse Jobs in Chicago')

        valid_filter_url = 'www.my.jobs/chicago/illinois/usa/jobs/mcdonalds/careers/'
        title, url = validate_dotjobs_url(valid_filter_url)
        self.assertIsNotNone(title)
        self.assertIsNotNone(url)

    def test_invalid_dotjobs_url(self):
        urls = [
            'http://google.com',  # url does not contain a feed
            '',  # url not provided
            'http://'
        ]  # invalid url provided
        for url in urls:
            title, url = validate_dotjobs_url(url)
            self.assertIsNone(title)
            self.assertIsNone(url)

    def test_date_in_range(self):
        start = datetime.date(month=1, day=1, year=2013)
        end = datetime.date(month=12, day=1, year=2013)
        x = datetime.date(month=6, day=1, year=2013)
        is_in_range = date_in_range(start, end, x)
        self.assertTrue(is_in_range)

        start = datetime.date(month=1, day=1, year=2013)
        end = datetime.date(month=12, day=1, year=2013)
        x = datetime.date(month=6, day=1, year=2010)
        is_in_range = date_in_range(start, end, x)
        self.assertFalse(is_in_range)

    def test_parse_rss(self):
        feed_url = 'http://www.my.jobs/feed/rss'
        items = parse_rss(feed_url)
        self.assertEqual(len(items), 1)

        item = items[0]
        for element in ['pubdate', 'title', 'description', 'link']:
            self.assertTrue(item[element])

    def test_url_sort_options(self):
        feed = 'http://www.my.jobs/jobs/feed/rss?date_sort=False'

        # Test to make sure sort by "Relevance" has '&date_sort=False' added
        # a single time
        feed_url = url_sort_options(feed, "Relevance")
        parsed = urlparse(feed_url)
        query = parse_qs(parsed.query)

        self.assertEquals(parsed.path, "/jobs/feed/rss")
        self.assertEquals(query['date_sort'], [u'False'])
        int(query['days_ago'][0])

        # Test to make sure sort by "Date" doesn't have anything added
        feed_url = url_sort_options(feed, "Date")
        self.assertEquals(feed_url, "http://www.my.jobs/jobs/feed/rss")

    def test_unicode_in_search(self):
        search = SavedSearch(
            url=u"http://www.my.jobs/search?q=%E2%80%93",
            user=self.user,
            feed=u"http://www.my.jobs/search/feed/rss?q=%E2%80%93",
            sort_by=u'Relevance')
        search.save()

        feed_url = url_sort_options(search.feed, search.sort_by)

        old = parse_qs(urlparse(search.feed).query)
        new = parse_qs(urlparse(feed_url).query)

        self.assertFalse(old.get('date_sort'))
        self.assertFalse(old.get('days_ago'))
        self.assertTrue(new['date_sort'][0])
        self.assertTrue(new['days_ago'][0])

        del new['date_sort']
        del new['days_ago']
        self.assertEqual(new, old)