Best Python code snippet using autotest_python
config_test.py
Source:config_test.py  
1# -*- coding: utf-8 -*-2import copy3import datetime4import mock5import os6import pytest7import elastalert.alerts8import elastalert.ruletypes9from elastalert.config import get_file_paths10from elastalert.config import load_configuration11from elastalert.config import load_modules12from elastalert.config import load_options13from elastalert.config import load_rules14from elastalert.util import EAException15from elastalert.config import import_rules16test_config = {'rules_folder': 'test_folder',17               'run_every': {'minutes': 10},18               'buffer_time': {'minutes': 10},19               'es_host': 'elasticsearch.test',20               'es_port': 12345,21               'writeback_index': 'test_index'}22test_rule = {'es_host': 'test_host',23             'es_port': 12345,24             'name': 'testrule',25             'type': 'spike',26             'spike_height': 2,27             'spike_type': 'up',28             'timeframe': {'minutes': 10},29             'index': 'test_index',30             'query_key': 'testkey',31             'compare_key': 'comparekey',32             'filter': [{'term': {'key': 'value'}}],33             'alert': 'email',34             'use_count_query': True,35             'doc_type': 'blsh',36             'email': 'test@test.test',37             'aggregation': {'hours': 2},38             'include': ['comparekey', '@timestamp']}39test_args = mock.Mock()40test_args.config = 'test_config'41test_args.rule = None42test_args.debug = False43test_args.es_debug_trace = None44def test_import_rules():45    test_rule_copy = copy.deepcopy(test_rule)46    test_rule_copy['type'] = 'testing.test.RuleType'47    with mock.patch('elastalert.config.yaml_loader') as mock_open:48        mock_open.return_value = test_rule_copy49        # Test that type is imported50        with mock.patch('__builtin__.__import__') as mock_import:51            mock_import.return_value = elastalert.ruletypes52            load_configuration('test_config', test_config)53        assert mock_import.call_args_list[0][0][0] == 'testing.test'54        assert mock_import.call_args_list[0][0][3] == ['RuleType']55        # Test that alerts are imported56        test_rule_copy = copy.deepcopy(test_rule)57        mock_open.return_value = test_rule_copy58        test_rule_copy['alert'] = 'testing2.test2.Alerter'59        with mock.patch('__builtin__.__import__') as mock_import:60            mock_import.return_value = elastalert.alerts61            load_configuration('test_config', test_config)62        assert mock_import.call_args_list[0][0][0] == 'testing2.test2'63        assert mock_import.call_args_list[0][0][3] == ['Alerter']64def test_import_import():65    import_rule = copy.deepcopy(test_rule)66    del(import_rule['es_host'])67    del(import_rule['es_port'])68    import_rule['import'] = 'importme.ymlt'69    import_me = {70        'es_host': 'imported_host',71        'es_port': 12349,72        'email': 'ignored@email',  # overwritten by the email in import_rule73    }74    with mock.patch('elastalert.config.yaml_loader') as mock_open:75        mock_open.side_effect = [import_rule, import_me]76        rules = load_configuration('blah.yaml', test_config)77        assert mock_open.call_args_list[0][0] == ('blah.yaml',)78        assert mock_open.call_args_list[1][0] == ('importme.ymlt',)79        assert len(mock_open.call_args_list) == 280        assert rules['es_port'] == 1234981        assert rules['es_host'] == 'imported_host'82        assert rules['email'] == ['test@test.test']83        assert rules['filter'] == import_rule['filter']84        # check global import_rule dependency85        assert import_rules == {'blah.yaml': ['importme.ymlt']}86def test_import_absolute_import():87    import_rule = copy.deepcopy(test_rule)88    del(import_rule['es_host'])89    del(import_rule['es_port'])90    import_rule['import'] = '/importme.ymlt'91    import_me = {92        'es_host': 'imported_host',93        'es_port': 12349,94        'email': 'ignored@email',  # overwritten by the email in import_rule95    }96    with mock.patch('elastalert.config.yaml_loader') as mock_open:97        mock_open.side_effect = [import_rule, import_me]98        rules = load_configuration('blah.yaml', test_config)99        assert mock_open.call_args_list[0][0] == ('blah.yaml',)100        assert mock_open.call_args_list[1][0] == ('/importme.ymlt',)101        assert len(mock_open.call_args_list) == 2102        assert rules['es_port'] == 12349103        assert rules['es_host'] == 'imported_host'104        assert rules['email'] == ['test@test.test']105        assert rules['filter'] == import_rule['filter']106def test_import_filter():107    # Check that if a filter is specified the rules are merged:108    import_rule = copy.deepcopy(test_rule)109    del(import_rule['es_host'])110    del(import_rule['es_port'])111    import_rule['import'] = 'importme.ymlt'112    import_me = {113        'es_host': 'imported_host',114        'es_port': 12349,115        'filter': [{'term': {'ratchet': 'clank'}}],116    }117    with mock.patch('elastalert.config.yaml_loader') as mock_open:118        mock_open.side_effect = [import_rule, import_me]119        rules = load_configuration('blah.yaml', test_config)120        assert rules['filter'] == [{'term': {'ratchet': 'clank'}}, {'term': {'key': 'value'}}]121def test_load_inline_alert_rule():122    test_rule_copy = copy.deepcopy(test_rule)123    test_rule_copy['alert'] = [124        {125            'email': {126                'email': 'foo@bar.baz'127            }128        },129        {130            'email': {131                'email': 'baz@foo.bar'132            }133        }134    ]135    test_config_copy = copy.deepcopy(test_config)136    with mock.patch('elastalert.config.yaml_loader') as mock_open:137        mock_open.side_effect = [test_config_copy, test_rule_copy]138        load_modules(test_rule_copy)139        assert isinstance(test_rule_copy['alert'][0], elastalert.alerts.EmailAlerter)140        assert isinstance(test_rule_copy['alert'][1], elastalert.alerts.EmailAlerter)141        assert 'foo@bar.baz' in test_rule_copy['alert'][0].rule['email']142        assert 'baz@foo.bar' in test_rule_copy['alert'][1].rule['email']143def test_load_rules():144    test_rule_copy = copy.deepcopy(test_rule)145    test_config_copy = copy.deepcopy(test_config)146    with mock.patch('elastalert.config.yaml_loader') as mock_open:147        mock_open.side_effect = [test_config_copy, test_rule_copy]148        with mock.patch('os.listdir') as mock_ls:149            mock_ls.return_value = ['testrule.yaml']150            rules = load_rules(test_args)151            assert isinstance(rules['rules'][0]['type'], elastalert.ruletypes.RuleType)152            assert isinstance(rules['rules'][0]['alert'][0], elastalert.alerts.Alerter)153            assert isinstance(rules['rules'][0]['timeframe'], datetime.timedelta)154            assert isinstance(rules['run_every'], datetime.timedelta)155            for included_key in ['comparekey', 'testkey', '@timestamp']:156                assert included_key in rules['rules'][0]['include']157            # Assert include doesn't contain duplicates158            assert rules['rules'][0]['include'].count('@timestamp') == 1159            assert rules['rules'][0]['include'].count('comparekey') == 1160def test_load_default_host_port():161    test_rule_copy = copy.deepcopy(test_rule)162    test_rule_copy.pop('es_host')163    test_rule_copy.pop('es_port')164    test_config_copy = copy.deepcopy(test_config)165    with mock.patch('elastalert.config.yaml_loader') as mock_open:166        mock_open.side_effect = [test_config_copy, test_rule_copy]167        with mock.patch('os.listdir') as mock_ls:168            mock_ls.return_value = ['testrule.yaml']169            rules = load_rules(test_args)170            # Assert include doesn't contain duplicates171            assert rules['es_port'] == 12345172            assert rules['es_host'] == 'elasticsearch.test'173def test_load_ssl_env_false():174    test_rule_copy = copy.deepcopy(test_rule)175    test_rule_copy.pop('es_host')176    test_rule_copy.pop('es_port')177    test_config_copy = copy.deepcopy(test_config)178    with mock.patch('elastalert.config.yaml_loader') as mock_open:179        mock_open.side_effect = [test_config_copy, test_rule_copy]180        with mock.patch('os.listdir') as mock_ls:181            with mock.patch.dict(os.environ, {'ES_USE_SSL': 'false'}):182                mock_ls.return_value = ['testrule.yaml']183                rules = load_rules(test_args)184                assert rules['use_ssl'] is False185def test_load_ssl_env_true():186    test_rule_copy = copy.deepcopy(test_rule)187    test_rule_copy.pop('es_host')188    test_rule_copy.pop('es_port')189    test_config_copy = copy.deepcopy(test_config)190    with mock.patch('elastalert.config.yaml_loader') as mock_open:191        mock_open.side_effect = [test_config_copy, test_rule_copy]192        with mock.patch('os.listdir') as mock_ls:193            with mock.patch.dict(os.environ, {'ES_USE_SSL': 'true'}):194                mock_ls.return_value = ['testrule.yaml']195                rules = load_rules(test_args)196                assert rules['use_ssl'] is True197def test_load_url_prefix_env():198    test_rule_copy = copy.deepcopy(test_rule)199    test_rule_copy.pop('es_host')200    test_rule_copy.pop('es_port')201    test_config_copy = copy.deepcopy(test_config)202    with mock.patch('elastalert.config.yaml_loader') as mock_open:203        mock_open.side_effect = [test_config_copy, test_rule_copy]204        with mock.patch('os.listdir') as mock_ls:205            with mock.patch.dict(os.environ, {'ES_URL_PREFIX': 'es/'}):206                mock_ls.return_value = ['testrule.yaml']207                rules = load_rules(test_args)208                assert rules['es_url_prefix'] == 'es/'209def test_load_disabled_rules():210    test_rule_copy = copy.deepcopy(test_rule)211    test_rule_copy['is_enabled'] = False212    test_config_copy = copy.deepcopy(test_config)213    with mock.patch('elastalert.config.yaml_loader') as mock_open:214        mock_open.side_effect = [test_config_copy, test_rule_copy]215        with mock.patch('os.listdir') as mock_ls:216            mock_ls.return_value = ['testrule.yaml']217            rules = load_rules(test_args)218            # The rule is not loaded for it has "is_enabled=False"219            assert len(rules['rules']) == 0220def test_compound_query_key():221    test_rule_copy = copy.deepcopy(test_rule)222    test_rule_copy.pop('use_count_query')223    test_rule_copy['query_key'] = ['field1', 'field2']224    load_options(test_rule_copy, test_config, 'filename.yaml')225    assert 'field1' in test_rule_copy['include']226    assert 'field2' in test_rule_copy['include']227    assert test_rule_copy['query_key'] == 'field1,field2'228    assert test_rule_copy['compound_query_key'] == ['field1', 'field2']229def test_name_inference():230    test_rule_copy = copy.deepcopy(test_rule)231    test_rule_copy.pop('name')232    load_options(test_rule_copy, test_config, 'msmerc woz ere.yaml')233    assert test_rule_copy['name'] == 'msmerc woz ere'234def test_raises_on_missing_config():235    optional_keys = ('aggregation', 'use_count_query', 'query_key', 'compare_key', 'filter', 'include', 'es_host', 'es_port', 'name')236    test_rule_copy = copy.deepcopy(test_rule)237    for key in test_rule_copy.keys():238        test_rule_copy = copy.deepcopy(test_rule)239        test_config_copy = copy.deepcopy(test_config)240        test_rule_copy.pop(key)241        # Non required keys242        if key in optional_keys:243            continue244        with mock.patch('elastalert.config.yaml_loader') as mock_open:245            mock_open.side_effect = [test_config_copy, test_rule_copy]246            with mock.patch('os.listdir') as mock_ls:247                mock_ls.return_value = ['testrule.yaml']248                with pytest.raises(EAException, message='key %s should be required' % key):249                    rule = load_rules(test_args)250                    print(rule)251def test_raises_on_bad_generate_kibana_filters():252    test_rule['generate_kibana_link'] = True253    bad_filters = [[{'not': {'terms': {'blah': 'blah'}}}],254                   [{'terms': {'blah': 'blah'}}],255                   [{'query': {'not_querystring': 'this:that'}}],256                   [{'query': {'wildcard': 'this*that'}}],257                   [{'blah': 'blah'}]]258    good_filters = [[{'term': {'field': 'value'}}],259                    [{'not': {'term': {'this': 'that'}}}],260                    [{'not': {'query': {'query_string': {'query': 'this:that'}}}}],261                    [{'query': {'query_string': {'query': 'this:that'}}}],262                    [{'range': {'blah': {'from': 'a', 'to': 'b'}}}],263                    [{'not': {'range': {'blah': {'from': 'a', 'to': 'b'}}}}]]264    # Test that all the good filters work, but fail with a bad filter added265    for good in good_filters:266        test_rule_copy = copy.deepcopy(test_rule)267        test_rule_copy['filter'] = good268        with mock.patch('elastalert.config.yaml_loader') as mock_open:269            mock_open.return_value = test_rule_copy270            load_configuration('blah', test_config)271            for bad in bad_filters:272                test_rule_copy['filter'] = good + bad273                with pytest.raises(EAException):274                    load_configuration('blah', test_config)275def test_get_file_paths_recursive():276    conf = {'scan_subdirectories': True, 'rules_folder': 'root'}277    walk_paths = (('root', ('folder_a', 'folder_b'), ('rule.yaml',)),278                  ('root/folder_a', (), ('a.yaml', 'ab.yaml')),279                  ('root/folder_b', (), ('b.yaml',)))280    with mock.patch('os.walk') as mock_walk:281        mock_walk.return_value = walk_paths282        paths = get_file_paths(conf)283    paths = [p.replace(os.path.sep, '/') for p in paths]284    assert 'root/rule.yaml' in paths285    assert 'root/folder_a/a.yaml' in paths286    assert 'root/folder_a/ab.yaml' in paths287    assert 'root/folder_b/b.yaml' in paths288    assert len(paths) == 4289def test_get_file_paths():290    # Check for no subdirectory291    conf = {'scan_subdirectories': False, 'rules_folder': 'root'}292    files = ['badfile', 'a.yaml', 'b.yaml']293    with mock.patch('os.listdir') as mock_list:294        with mock.patch('os.path.isfile') as mock_path:295            mock_path.return_value = True296            mock_list.return_value = files297            paths = get_file_paths(conf)298    paths = [p.replace(os.path.sep, '/') for p in paths]299    assert 'root/a.yaml' in paths300    assert 'root/b.yaml' in paths...checkteamtags_test.py
Source:checkteamtags_test.py  
1# Copyright 2017 The Chromium Authors. All rights reserved.2# Use of this source code is governed by a BSD-style license that can be3# found in the LICENSE file.4import json5import os6import sys7import unittest8import checkteamtags9SRC = os.path.join(os.path.dirname(__file__), os.path.pardir, os.path.pardir)10sys.path.append(os.path.join(SRC, 'third_party', 'pymock'))11import mock12def mock_file(lines):13  inner_mock = mock.MagicMock()14  inner_attrs = {'readlines.return_value': lines,15                 '__iter__.return_value': lines}16  inner_mock.configure_mock(**inner_attrs)17  return_val = mock.MagicMock()18  attrs = {'__enter__.return_value': inner_mock}19  return_val.configure_mock(**attrs)20  return return_val21DEFAULT_MAPPING = {22    'dir-to-component': {},23    'component-to-team': {},24}25def mock_url_open(data=None):26  """Simulate the result of fetching the cloud location of the mapping.27  i.e. https://storage.googleapis.com/chromium-owners/component_map.json28  """29  if data is None:30    data = DEFAULT_MAPPING31  class _MockJsonResponse(object):32    def __init__(self, data):33      self.data = data34    def read(self):35      return json.dumps(self.data)36  def inner(url):37    if url.endswith('.json'):38      return _MockJsonResponse(data)39  return inner40NO_TAGS = """41mock@chromium.org42""".splitlines()43MULTIPLE_COMPONENT_TAGS = """44mock@chromium.org45# COMPONENT: Blink>mock_component46# COMPONENT: V8>mock_component47""".splitlines()48MULTIPLE_COMPONENTS_IN_TAG = """49mock@chromium.org50# COMPONENT: Blink>mock_component, V8>mock_component51""".splitlines()52MISSING_COMPONENT = """53mock@chromium.org54# COMPONENT:55""".splitlines()56MULTIPLE_TEAM_TAGS = """57mock@chromium.org58# TEAM: some-team@chromium.org59# TEAM: some-other-team@chromium.org60""".splitlines()61MULTIPLE_TEAMS_IN_TAG = """62mock@chromium.org63# TEAM: some-team@chromium.org some-other-team@chromium.org64""".splitlines()65MISSING_TEAM = """66mock@chromium.org67# TEAM:68""".splitlines()69BASIC = """70mock@chromium.org71# TEAM: some-team@chromium.org72# COMPONENT: V8>mock_component73""".splitlines()74open_name = 'checkteamtags.open'75@mock.patch('sys.stdout', mock.MagicMock())76@mock.patch('os.path.exists', mock.MagicMock())77class CheckTeamTagsTest(unittest.TestCase):78  @mock.patch('urllib2.urlopen', mock_url_open())79  @mock.patch('sys.argv', ['checkteamtags', '--bare' ,'OWNERS'])80  def testNoTags(self):81    with mock.patch(open_name, create=True) as mock_open:82      mock_open.return_value = mock_file(NO_TAGS)83      self.assertEqual(0, checkteamtags.main())84  @mock.patch('urllib2.urlopen', mock_url_open())85  @mock.patch('sys.argv', ['checkteamtags', '--bare' ,'OWNERS'])86  def testMultipleComponentTags(self):87    with mock.patch(open_name, create=True) as mock_open:88      mock_open.return_value = mock_file(MULTIPLE_COMPONENT_TAGS)89      self.assertEqual(1, checkteamtags.main())90  @mock.patch('urllib2.urlopen', mock_url_open())91  @mock.patch('sys.argv', ['checkteamtags', '--bare' ,'OWNERS'])92  def testMultipleComponentsInTag(self):93    with mock.patch(open_name, create=True) as mock_open:94      mock_open.return_value = mock_file(MULTIPLE_COMPONENTS_IN_TAG)95      self.assertEqual(1, checkteamtags.main())96  @mock.patch('urllib2.urlopen', mock_url_open())97  @mock.patch('sys.argv', ['checkteamtags', '--bare' ,'OWNERS'])98  def testMissingComponent(self):99    with mock.patch(open_name, create=True) as mock_open:100      mock_open.return_value = mock_file(MISSING_COMPONENT)101      self.assertEqual(1, checkteamtags.main())102  @mock.patch('urllib2.urlopen', mock_url_open())103  @mock.patch('sys.argv', ['checkteamtags', '--bare' ,'OWNERS'])104  def testMultipleTeamTags(self):105    with mock.patch(open_name, create=True) as mock_open:106      mock_open.return_value = mock_file(MULTIPLE_TEAM_TAGS)107      self.assertEqual(1, checkteamtags.main())108  @mock.patch('urllib2.urlopen', mock_url_open())109  @mock.patch('sys.argv', ['checkteamtags', '--bare' ,'OWNERS'])110  def testMultipleTeamsInTag(self):111    with mock.patch(open_name, create=True) as mock_open:112      mock_open.return_value = mock_file(MULTIPLE_TEAMS_IN_TAG)113      self.assertEqual(1, checkteamtags.main())114  @mock.patch('urllib2.urlopen', mock_url_open())115  @mock.patch('sys.argv', ['checkteamtags', '--bare' ,'OWNERS'])116  def testMissingTeam(self):117    with mock.patch(open_name, create=True) as mock_open:118      mock_open.return_value = mock_file(MISSING_TEAM)119      self.assertEqual(1, checkteamtags.main())120  @mock.patch('urllib2.urlopen', mock_url_open())121  @mock.patch('sys.argv', ['checkteamtags', '--bare' ,'OWNERS'])122  def testBasic(self):123    with mock.patch(open_name, create=True) as mock_open:124      mock_open.return_value = mock_file(BASIC)125      self.assertEqual(0, checkteamtags.main())126  @mock.patch('urllib2.urlopen', mock_url_open({127      'dir-to-component': {128          'some/dir':      'V8>mock_component',129      },130      'component-to-team': {131          'V8>mock_component': 'some-other-team@chromium.org',132      },133  }))134  @mock.patch('sys.argv', ['checkteamtags', '--bare', 'fakepath/OWNERS'])135  def testMappingFail(self):136    with mock.patch(open_name, create=True) as mock_open:137      mock_open.return_value = mock_file(BASIC)138      with mock.patch('owners_file_tags.open', create=True) as mock_open_2:139        mock_open_2.return_value = mock_file(BASIC)140        self.assertEqual(1, checkteamtags.main())141  @mock.patch('urllib2.urlopen', mock_url_open({142      'dir-to-component': {143          'some/dir':      'V8>mock_component',144      },145      'component-to-team': {146          'V8>mock_component': 'some-other-team@chromium.org',147      },148  }))149  @mock.patch('sys.argv', ['checkteamtags', '--bare', 'some/dir/OWNERS'])150  def testMappingPassRename(self):151    with mock.patch(open_name, create=True) as mock_open:152      mock_open.return_value = mock_file(BASIC)153      with mock.patch('owners_file_tags.open', create=True) as mock_open_2:154        mock_open_2.return_value = mock_file(BASIC)155        self.assertEqual(0, checkteamtags.main())156  @mock.patch('urllib2.urlopen', mock_url_open({157      'dir-to-component': {158          'some/dir/':      'V8>mock_component',159      },160      'component-to-team': {161          'V8>mock_component': 'some-team@chromium.org',162      },163  }))164  @mock.patch('sys.argv', ['checkteamtags', '--bare', 'other/dir/OWNERS'])165  def testMappingPassNew(self):166    with mock.patch(open_name, create=True) as mock_open:167      mock_open.return_value = mock_file(BASIC)168      with mock.patch('owners_file_tags.open', create=True) as mock_open_2:169        mock_open_2.return_value = mock_file(BASIC)...test_utils.py
Source:test_utils.py  
...5from .base import BaseTestCase6class UtilsTestCase(BaseTestCase):7    def setUp(self):8        super(UtilsTestCase, self).setUp()9        self.mock_open = mock_open()10        self.mock_mkdir = patch('statikos.utils.os.mkdir').start()11        self.mock_json_dump = patch.object(utils.json, 'dump').start()12        self.mock_yaml_dump = patch.object(utils.yaml, 'dump').start()13        self.path = Mock()14        self.mock_path = patch('statikos.utils.Path').start()15        self.mock_path.return_value = self.path16    def test_touch(self):17        utils.touch('filename')18        self.path.touch.assert_called_once()19    def test_mkdir_directory_does_not_exist(self):20        utils.mkdir('path/to/directory')21        self.mock_mkdir.assert_called_once_with('path/to/directory')22    def test_mkdir_directory_does_exist(self):23        self.mock_mkdir.side_effect = FileExistsError24        utils.mkdir('path/to/directory')25    def test_read_file(self):26        read_data = 'data'27        self.mock_open = mock_open(read_data=read_data)28        with patch('builtins.open', self.mock_open):29            result = utils.read_file('filename')30        self.mock_open.assert_called_once_with('filename', 'r')31        self.assertEqual('data', result)32    def test_append_file(self):33        data = 'data'34        with patch('builtins.open', self.mock_open):35            utils.append_file(data, 'filename')36        self.mock_open.assert_called_once_with('filename', 'a')37        self.mock_open.return_value.write.assert_called_once_with('data')38    def test_write_file(self):39        data = 'data'40        with patch('builtins.open', self.mock_open):41            utils.write_file(data, 'filename')42        self.mock_open.assert_called_once_with('filename', 'w')43        self.mock_open.return_value.write.assert_called_once_with('data')44    def test_read_json_file(self):45        read_data = '{"a": 1, "b": 2, "c": 3}'46        self.mock_open = mock_open(read_data=read_data)47        with patch('builtins.open', self.mock_open):48            result = utils.read_json_file('filename')49        self.mock_open.assert_called_once_with('filename', 'r')50        self.assertEqual({'a': 1, 'b': 2, 'c': 3}, result)51    def test_write_json_file(self):52        data = {'a': 1, 'b': 2, 'c': 3}53        with patch('builtins.open', self.mock_open) as mock_file:54            utils.write_json_file(data, 'filename')55        self.mock_open.assert_called_once_with('filename', 'w')56        self.mock_json_dump.assert_called_once_with(57            data, mock_file.return_value, indent=258        )59    def test_read_yaml_file(self):60        read_data = \61            """62            a: 163            b: 264            c: 365            """66        self.mock_open = mock_open(read_data=read_data)67        with patch('builtins.open', self.mock_open):68            result = utils.read_yaml_file('filename')69        self.mock_open.assert_called_once_with('filename', 'r')70        self.assertEqual({'a': 1, 'b': 2, 'c': 3}, result)71    def test_write_yaml_file(self):72        data = {'a': 1, 'b': 2, 'c': 3}73        with patch('builtins.open', self.mock_open) as mock_file:74            utils.write_yaml_file(data, 'filename')75        self.mock_open.assert_called_once_with('filename', 'w')76        self.mock_yaml_dump.assert_called_once_with(77            data, mock_file.return_value, default_flow_style=False...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
