Best Python code snippet using lisa_python
test_settings.py
Source:test_settings.py  
1import unittest2class TestSettingsConfiguratorMixin(unittest.TestCase):3    def _makeOne(self, *arg, **kw):4        from pyramid.config import Configurator5        config = Configurator(*arg, **kw)6        return config7    def test__set_settings_as_None(self):8        config = self._makeOne()9        settings = config._set_settings(None)10        self.assertTrue(settings)11    def test__set_settings_as_dictwithvalues(self):12        config = self._makeOne()13        settings = config._set_settings({'a':'1'})14        self.assertEqual(settings['a'], '1')15    def test_get_settings_nosettings(self):16        from pyramid.registry import Registry17        reg = Registry()18        config = self._makeOne(reg)19        self.assertEqual(config.get_settings(), None)20    def test_get_settings_withsettings(self):21        settings = {'a':1}22        config = self._makeOne()23        config.registry.settings = settings24        self.assertEqual(config.get_settings(), settings)25    def test_add_settings_settings_already_registered(self):26        from pyramid.registry import Registry27        reg = Registry()28        config = self._makeOne(reg)29        config._set_settings({'a':1})30        config.add_settings({'b':2})31        settings = reg.settings32        self.assertEqual(settings['a'], 1)33        self.assertEqual(settings['b'], 2)34    def test_add_settings_settings_not_yet_registered(self):35        from pyramid.registry import Registry36        from pyramid.interfaces import ISettings37        reg = Registry()38        config = self._makeOne(reg)39        config.add_settings({'a':1})40        settings = reg.getUtility(ISettings)41        self.assertEqual(settings['a'], 1)42    def test_add_settings_settings_None(self):43        from pyramid.registry import Registry44        from pyramid.interfaces import ISettings45        reg = Registry()46        config = self._makeOne(reg)47        config.add_settings(None, a=1)48        settings = reg.getUtility(ISettings)49        self.assertEqual(settings['a'], 1)50class TestSettings(unittest.TestCase):51        52    def _getTargetClass(self):53        from pyramid.config.settings import Settings54        return Settings55    def _makeOne(self, d=None, environ=None):56        if environ is None:57            environ = {}58        klass = self._getTargetClass()59        return klass(d, _environ_=environ)60    def test_getattr_success(self):61        import warnings62        with warnings.catch_warnings(record=True) as w:63            warnings.filterwarnings('always')64            settings = self._makeOne({'reload_templates':False})65            self.assertEqual(settings.reload_templates, False)66            self.assertEqual(len(w), 1)67    def test_getattr_fail(self):68        import warnings69        with warnings.catch_warnings(record=True) as w:70            warnings.filterwarnings('always')71            settings = self._makeOne({})72            self.assertRaises(AttributeError, settings.__getattr__, 'wontexist')73            self.assertEqual(len(w), 0)74    def test_getattr_raises_attribute_error(self):75        settings = self._makeOne()76        self.assertRaises(AttributeError, settings.__getattr__, 'mykey')77    def test_noargs(self):78        settings = self._makeOne()79        self.assertEqual(settings['debug_authorization'], False)80        self.assertEqual(settings['debug_notfound'], False)81        self.assertEqual(settings['debug_routematch'], False)82        self.assertEqual(settings['reload_templates'], False)83        self.assertEqual(settings['reload_resources'], False)84        self.assertEqual(settings['pyramid.debug_authorization'], False)85        self.assertEqual(settings['pyramid.debug_notfound'], False)86        self.assertEqual(settings['pyramid.debug_routematch'], False)87        self.assertEqual(settings['pyramid.reload_templates'], False)88        self.assertEqual(settings['pyramid.reload_resources'], False)89    def test_prevent_http_cache(self):90        settings = self._makeOne({})91        self.assertEqual(settings['prevent_http_cache'], False)92        self.assertEqual(settings['pyramid.prevent_http_cache'], False)93        result = self._makeOne({'prevent_http_cache':'false'})94        self.assertEqual(result['prevent_http_cache'], False)95        self.assertEqual(result['pyramid.prevent_http_cache'], False)96        result = self._makeOne({'prevent_http_cache':'t'})97        self.assertEqual(result['prevent_http_cache'], True)98        self.assertEqual(result['pyramid.prevent_http_cache'], True)99        result = self._makeOne({'prevent_http_cache':'1'})100        self.assertEqual(result['prevent_http_cache'], True)101        self.assertEqual(result['pyramid.prevent_http_cache'], True)102        result = self._makeOne({'pyramid.prevent_http_cache':'t'})103        self.assertEqual(result['prevent_http_cache'], True)104        self.assertEqual(result['pyramid.prevent_http_cache'], True)105        result = self._makeOne({}, {'PYRAMID_PREVENT_HTTP_CACHE':'1'})106        self.assertEqual(result['prevent_http_cache'], True)107        self.assertEqual(result['pyramid.prevent_http_cache'], True)108        result = self._makeOne({'prevent_http_cache':'false',109                                'pyramid.prevent_http_cache':'1'})110        self.assertEqual(result['prevent_http_cache'], True)111        self.assertEqual(result['pyramid.prevent_http_cache'], True)112        result = self._makeOne({'prevent_http_cache':'false',113                                'pyramid.prevent_http_cache':'f'},114                               {'PYRAMID_PREVENT_HTTP_CACHE':'1'})115        self.assertEqual(result['prevent_http_cache'], True)116        self.assertEqual(result['pyramid.prevent_http_cache'], True)117    def test_reload_templates(self):118        settings = self._makeOne({})119        self.assertEqual(settings['reload_templates'], False)120        self.assertEqual(settings['pyramid.reload_templates'], False)121        result = self._makeOne({'reload_templates':'false'})122        self.assertEqual(result['reload_templates'], False)123        self.assertEqual(result['pyramid.reload_templates'], False)124        result = self._makeOne({'reload_templates':'t'})125        self.assertEqual(result['reload_templates'], True)126        self.assertEqual(result['pyramid.reload_templates'], True)127        result = self._makeOne({'reload_templates':'1'})128        self.assertEqual(result['reload_templates'], True)129        self.assertEqual(result['pyramid.reload_templates'], True)130        result = self._makeOne({'pyramid.reload_templates':'1'})131        self.assertEqual(result['reload_templates'], True)132        self.assertEqual(result['pyramid.reload_templates'], True)133        result = self._makeOne({}, {'PYRAMID_RELOAD_TEMPLATES':'1'})134        self.assertEqual(result['reload_templates'], True)135        self.assertEqual(result['pyramid.reload_templates'], True)136        result = self._makeOne({'reload_templates':'false',137                                'pyramid.reload_templates':'1'})138        self.assertEqual(result['reload_templates'], True)139        self.assertEqual(result['pyramid.reload_templates'], True)140        result = self._makeOne({'reload_templates':'false'},141                               {'PYRAMID_RELOAD_TEMPLATES':'1'})142        self.assertEqual(result['reload_templates'], True)143        self.assertEqual(result['pyramid.reload_templates'], True)144    def test_reload_resources(self):145        # alias for reload_assets146        result = self._makeOne({})147        self.assertEqual(result['reload_resources'], False)148        self.assertEqual(result['reload_assets'], False)149        self.assertEqual(result['pyramid.reload_resources'], False)150        self.assertEqual(result['pyramid.reload_assets'], False)151        result = self._makeOne({'reload_resources':'false'})152        self.assertEqual(result['reload_resources'], False)153        self.assertEqual(result['reload_assets'], False)154        self.assertEqual(result['pyramid.reload_resources'], False)155        self.assertEqual(result['pyramid.reload_assets'], False)156        result = self._makeOne({'reload_resources':'t'})157        self.assertEqual(result['reload_resources'], True)158        self.assertEqual(result['reload_assets'], True)159        self.assertEqual(result['pyramid.reload_resources'], True)160        self.assertEqual(result['pyramid.reload_assets'], True)161        result = self._makeOne({'reload_resources':'1'})162        self.assertEqual(result['reload_resources'], True)163        self.assertEqual(result['reload_assets'], True)164        self.assertEqual(result['pyramid.reload_resources'], True)165        self.assertEqual(result['pyramid.reload_assets'], True)166        result = self._makeOne({'pyramid.reload_resources':'1'})167        self.assertEqual(result['reload_resources'], True)168        self.assertEqual(result['reload_assets'], True)169        self.assertEqual(result['pyramid.reload_resources'], True)170        self.assertEqual(result['pyramid.reload_assets'], True)171        result = self._makeOne({}, {'PYRAMID_RELOAD_RESOURCES':'1'})172        self.assertEqual(result['reload_resources'], True)173        self.assertEqual(result['reload_assets'], True)174        self.assertEqual(result['pyramid.reload_resources'], True)175        self.assertEqual(result['pyramid.reload_assets'], True)176        result = self._makeOne({'reload_resources':'false',177                                'pyramid.reload_resources':'1'})178        self.assertEqual(result['reload_resources'], True)179        self.assertEqual(result['reload_assets'], True)180        self.assertEqual(result['pyramid.reload_resources'], True)181        self.assertEqual(result['pyramid.reload_assets'], True)182        result = self._makeOne({'reload_resources':'false',183                                'pyramid.reload_resources':'false'},184                               {'PYRAMID_RELOAD_RESOURCES':'1'})185        self.assertEqual(result['reload_resources'], True)186        self.assertEqual(result['reload_assets'], True)187        self.assertEqual(result['pyramid.reload_resources'], True)188        self.assertEqual(result['pyramid.reload_assets'], True)189    def test_reload_assets(self):190        # alias for reload_resources191        result = self._makeOne({})192        self.assertEqual(result['reload_assets'], False)193        self.assertEqual(result['reload_resources'], False)194        self.assertEqual(result['pyramid.reload_assets'], False)195        self.assertEqual(result['pyramid.reload_resources'], False)196        result = self._makeOne({'reload_assets':'false'})197        self.assertEqual(result['reload_resources'], False)198        self.assertEqual(result['reload_assets'], False)199        self.assertEqual(result['pyramid.reload_assets'], False)200        self.assertEqual(result['pyramid.reload_resources'], False)201        result = self._makeOne({'reload_assets':'t'})202        self.assertEqual(result['reload_assets'], True)203        self.assertEqual(result['reload_resources'], True)204        self.assertEqual(result['pyramid.reload_assets'], True)205        self.assertEqual(result['pyramid.reload_resources'], True)206        result = self._makeOne({'reload_assets':'1'})207        self.assertEqual(result['reload_assets'], True)208        self.assertEqual(result['reload_resources'], True)209        self.assertEqual(result['pyramid.reload_assets'], True)210        self.assertEqual(result['pyramid.reload_resources'], True)211        result = self._makeOne({'pyramid.reload_assets':'1'})212        self.assertEqual(result['reload_assets'], True)213        self.assertEqual(result['reload_resources'], True)214        self.assertEqual(result['pyramid.reload_assets'], True)215        self.assertEqual(result['pyramid.reload_resources'], True)216        result = self._makeOne({}, {'PYRAMID_RELOAD_ASSETS':'1'})217        self.assertEqual(result['reload_assets'], True)218        self.assertEqual(result['reload_resources'], True)219        self.assertEqual(result['pyramid.reload_assets'], True)220        self.assertEqual(result['pyramid.reload_resources'], True)221        result = self._makeOne({'reload_assets':'false',222                                'pyramid.reload_assets':'1'})223        self.assertEqual(result['reload_assets'], True)224        self.assertEqual(result['reload_resources'], True)225        self.assertEqual(result['pyramid.reload_assets'], True)226        self.assertEqual(result['pyramid.reload_resources'], True)227        result = self._makeOne({'reload_assets':'false',228                                'pyramid.reload_assets':'false'},229                               {'PYRAMID_RELOAD_ASSETS':'1'})230        self.assertEqual(result['reload_assets'], True)231        self.assertEqual(result['reload_resources'], True)232        self.assertEqual(result['pyramid.reload_assets'], True)233        self.assertEqual(result['pyramid.reload_resources'], True)234    def test_reload_all(self):235        result = self._makeOne({})236        self.assertEqual(result['reload_templates'], False)237        self.assertEqual(result['reload_resources'], False)238        self.assertEqual(result['reload_assets'], False)239        self.assertEqual(result['pyramid.reload_templates'], False)240        self.assertEqual(result['pyramid.reload_resources'], False)241        self.assertEqual(result['pyramid.reload_assets'], False)242        result = self._makeOne({'reload_all':'false'})243        self.assertEqual(result['reload_templates'], False)244        self.assertEqual(result['reload_resources'], False)245        self.assertEqual(result['reload_assets'], False)246        self.assertEqual(result['pyramid.reload_templates'], False)247        self.assertEqual(result['pyramid.reload_resources'], False)248        self.assertEqual(result['pyramid.reload_assets'], False)249        result = self._makeOne({'reload_all':'t'})250        self.assertEqual(result['reload_templates'], True)251        self.assertEqual(result['reload_resources'], True)252        self.assertEqual(result['reload_assets'], True)253        self.assertEqual(result['pyramid.reload_templates'], True)254        self.assertEqual(result['pyramid.reload_resources'], True)255        self.assertEqual(result['pyramid.reload_assets'], True)256        result = self._makeOne({'reload_all':'1'})257        self.assertEqual(result['reload_templates'], True)258        self.assertEqual(result['reload_resources'], True)259        self.assertEqual(result['reload_assets'], True)260        self.assertEqual(result['pyramid.reload_templates'], True)261        self.assertEqual(result['pyramid.reload_resources'], True)262        self.assertEqual(result['pyramid.reload_assets'], True)263        result = self._makeOne({'pyramid.reload_all':'1'})264        self.assertEqual(result['reload_templates'], True)265        self.assertEqual(result['reload_resources'], True)266        self.assertEqual(result['reload_assets'], True)267        self.assertEqual(result['pyramid.reload_templates'], True)268        self.assertEqual(result['pyramid.reload_resources'], True)269        self.assertEqual(result['pyramid.reload_assets'], True)270        result = self._makeOne({}, {'PYRAMID_RELOAD_ALL':'1'})271        self.assertEqual(result['reload_templates'], True)272        self.assertEqual(result['reload_resources'], True)273        self.assertEqual(result['reload_assets'], True)274        self.assertEqual(result['pyramid.reload_templates'], True)275        self.assertEqual(result['pyramid.reload_resources'], True)276        self.assertEqual(result['pyramid.reload_assets'], True)277        result = self._makeOne({'reload_all':'false',278                                'pyramid.reload_all':'1'})279        self.assertEqual(result['reload_templates'], True)280        self.assertEqual(result['reload_resources'], True)281        self.assertEqual(result['reload_assets'], True)282        self.assertEqual(result['pyramid.reload_templates'], True)283        self.assertEqual(result['pyramid.reload_resources'], True)284        self.assertEqual(result['pyramid.reload_assets'], True)285        result = self._makeOne({'reload_all':'false',286                                'pyramid.reload_all':'false'},287                               {'PYRAMID_RELOAD_ALL':'1'})288        self.assertEqual(result['reload_templates'], True)289        self.assertEqual(result['reload_resources'], True)290        self.assertEqual(result['reload_assets'], True)291        self.assertEqual(result['pyramid.reload_templates'], True)292        self.assertEqual(result['pyramid.reload_resources'], True)293        self.assertEqual(result['pyramid.reload_assets'], True)294    def test_debug_authorization(self):295        result = self._makeOne({})296        self.assertEqual(result['debug_authorization'], False)297        self.assertEqual(result['pyramid.debug_authorization'], False)298        result = self._makeOne({'debug_authorization':'false'})299        self.assertEqual(result['debug_authorization'], False)300        self.assertEqual(result['pyramid.debug_authorization'], False)301        result = self._makeOne({'debug_authorization':'t'})302        self.assertEqual(result['debug_authorization'], True)303        self.assertEqual(result['pyramid.debug_authorization'], True)304        result = self._makeOne({'debug_authorization':'1'})305        self.assertEqual(result['debug_authorization'], True)306        self.assertEqual(result['pyramid.debug_authorization'], True)307        result = self._makeOne({'pyramid.debug_authorization':'1'})308        self.assertEqual(result['debug_authorization'], True)309        self.assertEqual(result['pyramid.debug_authorization'], True)310        result = self._makeOne({}, {'PYRAMID_DEBUG_AUTHORIZATION':'1'})311        self.assertEqual(result['debug_authorization'], True)312        self.assertEqual(result['pyramid.debug_authorization'], True)313        result = self._makeOne({'debug_authorization':'false',314                                'pyramid.debug_authorization':'1'})315        self.assertEqual(result['debug_authorization'], True)316        self.assertEqual(result['pyramid.debug_authorization'], True)317        result = self._makeOne({'debug_authorization':'false',318                                'pyramid.debug_authorization':'false'},319                               {'PYRAMID_DEBUG_AUTHORIZATION':'1'})320        self.assertEqual(result['debug_authorization'], True)321        self.assertEqual(result['pyramid.debug_authorization'], True)322    def test_debug_notfound(self):323        result = self._makeOne({})324        self.assertEqual(result['debug_notfound'], False)325        self.assertEqual(result['pyramid.debug_notfound'], False)326        result = self._makeOne({'debug_notfound':'false'})327        self.assertEqual(result['debug_notfound'], False)328        self.assertEqual(result['pyramid.debug_notfound'], False)329        result = self._makeOne({'debug_notfound':'t'})330        self.assertEqual(result['debug_notfound'], True)331        self.assertEqual(result['pyramid.debug_notfound'], True)332        result = self._makeOne({'debug_notfound':'1'})333        self.assertEqual(result['debug_notfound'], True)334        self.assertEqual(result['pyramid.debug_notfound'], True)335        result = self._makeOne({'pyramid.debug_notfound':'1'})336        self.assertEqual(result['debug_notfound'], True)337        self.assertEqual(result['pyramid.debug_notfound'], True)338        result = self._makeOne({}, {'PYRAMID_DEBUG_NOTFOUND':'1'})339        self.assertEqual(result['debug_notfound'], True)340        self.assertEqual(result['pyramid.debug_notfound'], True)341        result = self._makeOne({'debug_notfound':'false',342                                'pyramid.debug_notfound':'1'})343        self.assertEqual(result['debug_notfound'], True)344        self.assertEqual(result['pyramid.debug_notfound'], True)345        result = self._makeOne({'debug_notfound':'false',346                                'pyramid.debug_notfound':'false'},347                               {'PYRAMID_DEBUG_NOTFOUND':'1'})348        self.assertEqual(result['debug_notfound'], True)349        self.assertEqual(result['pyramid.debug_notfound'], True)350    def test_debug_routematch(self):351        result = self._makeOne({})352        self.assertEqual(result['debug_routematch'], False)353        self.assertEqual(result['pyramid.debug_routematch'], False)354        result = self._makeOne({'debug_routematch':'false'})355        self.assertEqual(result['debug_routematch'], False)356        self.assertEqual(result['pyramid.debug_routematch'], False)357        result = self._makeOne({'debug_routematch':'t'})358        self.assertEqual(result['debug_routematch'], True)359        self.assertEqual(result['pyramid.debug_routematch'], True)360        result = self._makeOne({'debug_routematch':'1'})361        self.assertEqual(result['debug_routematch'], True)362        self.assertEqual(result['pyramid.debug_routematch'], True)363        result = self._makeOne({'pyramid.debug_routematch':'1'})364        self.assertEqual(result['debug_routematch'], True)365        self.assertEqual(result['pyramid.debug_routematch'], True)366        result = self._makeOne({}, {'PYRAMID_DEBUG_ROUTEMATCH':'1'})367        self.assertEqual(result['debug_routematch'], True)368        self.assertEqual(result['pyramid.debug_routematch'], True)369        result = self._makeOne({'debug_routematch':'false',370                                'pyramid.debug_routematch':'1'})371        self.assertEqual(result['debug_routematch'], True)372        self.assertEqual(result['pyramid.debug_routematch'], True)373        result = self._makeOne({'debug_routematch':'false',374                                'pyramid.debug_routematch':'false'},375                               {'PYRAMID_DEBUG_ROUTEMATCH':'1'})376        self.assertEqual(result['debug_routematch'], True)377        self.assertEqual(result['pyramid.debug_routematch'], True)378    def test_debug_templates(self):379        result = self._makeOne({})380        self.assertEqual(result['debug_templates'], False)381        self.assertEqual(result['pyramid.debug_templates'], False)382        result = self._makeOne({'debug_templates':'false'})383        self.assertEqual(result['debug_templates'], False)384        self.assertEqual(result['pyramid.debug_templates'], False)385        result = self._makeOne({'debug_templates':'t'})386        self.assertEqual(result['debug_templates'], True)387        self.assertEqual(result['pyramid.debug_templates'], True)388        result = self._makeOne({'debug_templates':'1'})389        self.assertEqual(result['debug_templates'], True)390        self.assertEqual(result['pyramid.debug_templates'], True)391        result = self._makeOne({'pyramid.debug_templates':'1'})392        self.assertEqual(result['debug_templates'], True)393        self.assertEqual(result['pyramid.debug_templates'], True)394        result = self._makeOne({}, {'PYRAMID_DEBUG_TEMPLATES':'1'})395        self.assertEqual(result['debug_templates'], True)396        self.assertEqual(result['pyramid.debug_templates'], True)397        result = self._makeOne({'debug_templates':'false',398                                'pyramid.debug_templates':'1'})399        self.assertEqual(result['debug_templates'], True)400        self.assertEqual(result['pyramid.debug_templates'], True)401        result = self._makeOne({'debug_templates':'false',402                                'pyramid.debug_templates':'false'},403                               {'PYRAMID_DEBUG_TEMPLATES':'1'})404        self.assertEqual(result['debug_templates'], True)405        self.assertEqual(result['pyramid.debug_templates'], True)406    def test_debug_all(self):407        result = self._makeOne({})408        self.assertEqual(result['debug_notfound'], False)409        self.assertEqual(result['debug_routematch'], False)410        self.assertEqual(result['debug_authorization'], False)411        self.assertEqual(result['debug_templates'], False)412        self.assertEqual(result['pyramid.debug_notfound'], False)413        self.assertEqual(result['pyramid.debug_routematch'], False)414        self.assertEqual(result['pyramid.debug_authorization'], False)415        self.assertEqual(result['pyramid.debug_templates'], False)416        result = self._makeOne({'debug_all':'false'})417        self.assertEqual(result['debug_notfound'], False)418        self.assertEqual(result['debug_routematch'], False)419        self.assertEqual(result['debug_authorization'], False)420        self.assertEqual(result['debug_templates'], False)421        self.assertEqual(result['pyramid.debug_notfound'], False)422        self.assertEqual(result['pyramid.debug_routematch'], False)423        self.assertEqual(result['pyramid.debug_authorization'], False)424        self.assertEqual(result['pyramid.debug_templates'], False)425        result = self._makeOne({'debug_all':'t'})426        self.assertEqual(result['debug_notfound'], True)427        self.assertEqual(result['debug_routematch'], True)428        self.assertEqual(result['debug_authorization'], True)429        self.assertEqual(result['debug_templates'], True)430        self.assertEqual(result['pyramid.debug_notfound'], True)431        self.assertEqual(result['pyramid.debug_routematch'], True)432        self.assertEqual(result['pyramid.debug_authorization'], True)433        self.assertEqual(result['pyramid.debug_templates'], True)434        result = self._makeOne({'debug_all':'1'})435        self.assertEqual(result['debug_notfound'], True)436        self.assertEqual(result['debug_routematch'], True)437        self.assertEqual(result['debug_authorization'], True)438        self.assertEqual(result['debug_templates'], True)439        self.assertEqual(result['pyramid.debug_notfound'], True)440        self.assertEqual(result['pyramid.debug_routematch'], True)441        self.assertEqual(result['pyramid.debug_authorization'], True)442        self.assertEqual(result['pyramid.debug_templates'], True)443        result = self._makeOne({'pyramid.debug_all':'1'})444        self.assertEqual(result['debug_notfound'], True)445        self.assertEqual(result['debug_routematch'], True)446        self.assertEqual(result['debug_authorization'], True)447        self.assertEqual(result['debug_templates'], True)448        self.assertEqual(result['pyramid.debug_notfound'], True)449        self.assertEqual(result['pyramid.debug_routematch'], True)450        self.assertEqual(result['pyramid.debug_authorization'], True)451        self.assertEqual(result['pyramid.debug_templates'], True)452        result = self._makeOne({}, {'PYRAMID_DEBUG_ALL':'1'})453        self.assertEqual(result['debug_notfound'], True)454        self.assertEqual(result['debug_routematch'], True)455        self.assertEqual(result['debug_authorization'], True)456        self.assertEqual(result['debug_templates'], True)457        self.assertEqual(result['pyramid.debug_notfound'], True)458        self.assertEqual(result['pyramid.debug_routematch'], True)459        self.assertEqual(result['pyramid.debug_authorization'], True)460        self.assertEqual(result['pyramid.debug_templates'], True)461        result = self._makeOne({'debug_all':'false',462                                'pyramid.debug_all':'1'})463        self.assertEqual(result['debug_notfound'], True)464        self.assertEqual(result['debug_routematch'], True)465        self.assertEqual(result['debug_authorization'], True)466        self.assertEqual(result['debug_templates'], True)467        self.assertEqual(result['pyramid.debug_notfound'], True)468        self.assertEqual(result['pyramid.debug_routematch'], True)469        self.assertEqual(result['pyramid.debug_authorization'], True)470        self.assertEqual(result['pyramid.debug_templates'], True)471        result = self._makeOne({'debug_all':'false',472                                'pyramid.debug_all':'false'},473                               {'PYRAMID_DEBUG_ALL':'1'})474        self.assertEqual(result['debug_notfound'], True)475        self.assertEqual(result['debug_routematch'], True)476        self.assertEqual(result['debug_authorization'], True)477        self.assertEqual(result['debug_templates'], True)478        self.assertEqual(result['pyramid.debug_notfound'], True)479        self.assertEqual(result['pyramid.debug_routematch'], True)480        self.assertEqual(result['pyramid.debug_authorization'], True)481        self.assertEqual(result['pyramid.debug_templates'], True)482    def test_default_locale_name(self):483        result = self._makeOne({})484        self.assertEqual(result['default_locale_name'], 'en')485        self.assertEqual(result['pyramid.default_locale_name'], 'en')486        result = self._makeOne({'default_locale_name':'abc'})487        self.assertEqual(result['default_locale_name'], 'abc')488        self.assertEqual(result['pyramid.default_locale_name'], 'abc')489        result = self._makeOne({'pyramid.default_locale_name':'abc'})490        self.assertEqual(result['default_locale_name'], 'abc')491        self.assertEqual(result['pyramid.default_locale_name'], 'abc')492        result = self._makeOne({}, {'PYRAMID_DEFAULT_LOCALE_NAME':'abc'})493        self.assertEqual(result['default_locale_name'], 'abc')494        self.assertEqual(result['pyramid.default_locale_name'], 'abc')495        result = self._makeOne({'default_locale_name':'def',496                                'pyramid.default_locale_name':'abc'})497        self.assertEqual(result['default_locale_name'], 'abc')498        self.assertEqual(result['pyramid.default_locale_name'], 'abc')499        result = self._makeOne({'default_locale_name':'def',500                                'pyramid.default_locale_name':'ghi'},501                               {'PYRAMID_DEFAULT_LOCALE_NAME':'abc'})502        self.assertEqual(result['default_locale_name'], 'abc')503        self.assertEqual(result['pyramid.default_locale_name'], 'abc')504    def test_originals_kept(self):505        result = self._makeOne({'a':'i am so a'})...__init__.py
Source:__init__.py  
1# Copyright (c) 2019-present, Facebook, Inc.2# All rights reserved.3#4# This source code is licensed under the license found in the5# LICENSE file in the root directory of this source tree.6#7from logging import getLogger8import os9import torch10from .pretrain import load_embeddings11# , TRANSFORMER_LAYER_PARAMS12from .transformer import DECODER_ONLY_PARAMS, TransformerModel13logger = getLogger()14def check_model_params(params):15    """16    Check models parameters.17    """18    # masked language modeling task parameters19    assert params.bptt >= 120    assert 0 <= params.word_pred < 121    assert 0 <= params.sample_alpha < 122    s = params.word_mask_keep_rand.split(',')23    assert len(s) == 324    s = [float(x) for x in s]25    assert all([0 <= x <= 1 for x in s]) and sum(s) == 126    params.word_mask = s[0]27    params.word_keep = s[1]28    params.word_rand = s[2]29    # input sentence noise for DAE30    if len(params.ae_steps) == 0:31        assert params.word_shuffle == 032        assert params.word_dropout == 033        assert params.word_blank == 034    else:35        assert params.word_shuffle == 0 or params.word_shuffle > 136        assert 0 <= params.word_dropout < 137        assert 0 <= params.word_blank < 138    # model dimensions39    if params.emb_dim_encoder == 0 and params.emb_dim_decoder == 0:40        assert params.emb_dim > 041        params.emb_dim_encoder = params.emb_dim42        params.emb_dim_decoder = params.emb_dim43    else:44        assert params.emb_dim == 045        assert params.emb_dim_encoder > 0 and params.emb_dim_decoder > 046        if params.emb_dim_encoder == params.emb_dim_decoder:47            params.emb_dim = params.emb_dim_decoder48        else:49            assert params.reload_emb == "", 'Pre-trained embeddings are not supported when the embedding size of the ' \50                                            'encoder and the decoder do not match '51    assert params.emb_dim_encoder % params.n_heads == 052    assert params.emb_dim_decoder % params.n_heads == 053    if params.n_layers_encoder == 0 and params.n_layers_decoder == 0:54        assert params.n_layers > 055        params.n_layers_encoder = params.n_layers56        params.n_layers_decoder = params.n_layers57    else:58        assert params.n_layers == 059    assert params.n_layers_encoder > 0 and params.n_layers_decoder > 060    # reload pretrained word embeddings61    if params.reload_emb != '':62        assert os.path.isfile(params.reload_emb)63    # reload a pretrained model64    if params.reload_model != '':65        if params.encoder_only:66            assert os.path.isfile(params.reload_model)67        else:68            s = params.reload_model.split(',')69            assert len(s) == 270            assert all([x == '' or os.path.isfile(x) for x in s])71    assert not (params.beam_size > 1 and params.number_samples >72                1), 'Cannot sample when already doing beam search'73    assert (params.eval_temperature is None) == (params.number_samples <=74                                                 1), 'Eval temperature should be set if and only if taking several samples at eval time'75def set_pretrain_emb(model, dico, word2id, embeddings):76    """77    Pretrain word embeddings.78    """79    n_found = 080    with torch.no_grad():81        for i in range(len(dico)):82            idx = word2id.get(dico[i], None)83            if idx is None:84                continue85            n_found += 186            model.embeddings.weight[i] = embeddings[idx].cuda()87            model.pred_layer.proj.weight[i] = embeddings[idx].cuda()88    logger.info("Pretrained %i/%i words (%.3f%%)."89                % (n_found, len(dico), 100. * n_found / len(dico)))90def build_model(params, dico):91    """92    Build model.93    """94    if params.encoder_only:95        # build96        model = TransformerModel(97            params, dico, is_encoder=True, with_output=True)98        # reload pretrained word embeddings99        if params.reload_emb != '':100            word2id, embeddings = load_embeddings(params.reload_emb, params)101            set_pretrain_emb(model, dico, word2id, embeddings)102        # reload a pretrained model103        if params.reload_model != '':104            logger.info("Reloading model from %s ..." % params.reload_model)105            reloaded = torch.load(params.reload_model, map_location=lambda storage, loc: storage.cuda(106                params.local_rank))['model']107            if all([k.startswith('module.') for k in reloaded.keys()]):108                reloaded = {k[len('module.'):]: v for k, v in reloaded.items()}109            # # HACK to reload models with less layers110            # for i in range(12, 24):111            #     for k in TRANSFORMER_LAYER_PARAMS:112            #         k = k % i113            #         if k in model.state_dict() and k not in reloaded:114            #             logger.warning("Parameter %s not found. Ignoring ..." % k)115            #             reloaded[k] = model.state_dict()[k]116            model.load_state_dict(reloaded)117        logger.info("Model: {}".format(model))118        logger.info("Number of parameters (model): %i" % sum(119            [p.numel() for p in model.parameters() if p.requires_grad]))120        return [model.cuda()]121    else:122        # build123        # TODO: only output when necessary - len(params.clm_steps + params.mlm_steps) > 0124        encoder = TransformerModel(125            params, dico, is_encoder=True, with_output=True)126        if params.separate_decoders:127            decoders = [TransformerModel(128                params, dico, is_encoder=False, with_output=True) for _ in params.lang2id.values()]129        else:130            decoders = [TransformerModel(131                params, dico, is_encoder=False, with_output=True)]132        for layer in range(params.n_layers_decoder):133            if layer <= params.n_share_dec - 1:134                assert params.amp == -1, "sharing layers is not supported with AMP"135                logger.info(136                    "Sharing decoder attention parameters for layer %i" % layer)137                for i in range(1, len(decoders)):138                    decoders[i].attentions[layer] = decoders[0].attentions[layer]139        # reload pretrained word embeddings140        if params.reload_emb != '':141            word2id, embeddings = load_embeddings(params.reload_emb, params)142            set_pretrain_emb(encoder, dico, word2id, embeddings)143            set_pretrain_emb(decoders, dico, word2id, embeddings)144        # reload a pretrained model145        if params.reload_model != '':146            enc_path, dec_path = params.reload_model.split(',')147            assert not (enc_path == '' and dec_path == '')148            # reload encoder149            if enc_path != '':150                logger.info("Reloading encoder from %s ..." % enc_path)151                enc_reload = torch.load(152                    enc_path, map_location=lambda storage, loc: storage.cuda(params.local_rank))153                enc_reload = enc_reload['model' if 'model' in enc_reload else 'encoder']154                if all([k.startswith('module.') for k in enc_reload.keys()]):155                    enc_reload = {k[len('module.'):]: v for k,156                                  v in enc_reload.items()}157                # # HACK to reload models trained with less languages158                n_langs = len(params.langs)159                n_langs_reload = enc_reload['lang_embeddings.weight'].size()[0]160                assert n_langs == n_langs_reload or n_langs == 2 * \161                    n_langs_reload or n_langs == 2 * n_langs_reload + 1162                if n_langs == 2 * n_langs_reload:163                    enc_reload['lang_embeddings.weight'] = enc_reload['lang_embeddings.weight'].transpose(164                        0, 1).repeat_interleave(2, 1).transpose(0, 1)165                elif n_langs == 2 * n_langs_reload + 1:166                    enc_reload['lang_embeddings.weight'] = enc_reload['lang_embeddings.weight'].transpose(167                        0, 1).repeat_interleave(2, 1).transpose(0, 1)168                    enc_reload['lang_embeddings.weight'] = torch.cat(169                        [enc_reload['lang_embeddings.weight'][0, :].unsqueeze(dim=0), enc_reload['lang_embeddings.weight']])170                if encoder.position_embeddings.weight.size()[0] == 2 * enc_reload['position_embeddings.weight'].size()[0]:171                    enc_reload['position_embeddings.weight'] = enc_reload['position_embeddings.weight'].repeat(172                        2, 1)173                encoder.load_state_dict(enc_reload)174            # reload decoders175            if dec_path != '':176                for dec in decoders:177                    logger.info("Reloading decoders from %s ..." % dec_path)178                    dec_reload = torch.load(179                        dec_path, map_location=lambda storage, loc: storage.cuda(params.local_rank))180                    dec_reload = dec_reload['model' if 'model' in dec_reload else 'decoder']181                    if all([k.startswith('module.') for k in dec_reload.keys()]):182                        dec_reload = {183                            k[len('module.'):]: v for k, v in dec_reload.items()}184                    # # HACK to reload models trained with less languages185                    n_langs = len(params.langs)186                    n_langs_reload = dec_reload['lang_embeddings.weight'].size()[187                        0]188                    assert n_langs == n_langs_reload or n_langs == 2 * \189                        n_langs_reload or n_langs == 2 * n_langs_reload + 1190                    if n_langs == 2 * n_langs_reload:191                        dec_reload['lang_embeddings.weight'] = dec_reload['lang_embeddings.weight'].transpose(192                            0, 1).repeat_interleave(2, 1).transpose(0, 1)193                    elif n_langs == 2 * n_langs_reload + 1:194                        dec_reload['lang_embeddings.weight'] = dec_reload['lang_embeddings.weight'].transpose(195                            0, 1).repeat_interleave(2, 1).transpose(0, 1)196                        dec_reload['lang_embeddings.weight'] = torch.cat(197                            [dec_reload['lang_embeddings.weight'][0, :].unsqueeze(dim=0), dec_reload['lang_embeddings.weight']])198                    if dec.position_embeddings.weight.size()[0] == 2 * dec_reload['position_embeddings.weight'].size()[0]:199                        dec_reload['position_embeddings.weight'] = dec_reload['position_embeddings.weight'].repeat(200                            2, 1)201                    for i in range(params.n_layers_decoder):202                        for name in DECODER_ONLY_PARAMS:203                            if name % i not in dec_reload:204                                logger.warning(205                                    "Parameter %s not found." % (name % i))206                                dec_reload[name % i] = dec.state_dict()[207                                    name % i]208                    dec.load_state_dict(dec_reload)209        logger.debug("Encoder: {}".format(encoder))210        logger.debug("Decoder: {}".format(decoders))211        logger.info("Number of parameters (encoder): %i" % sum(212            [p.numel() for p in encoder.parameters() if p.requires_grad]))213        logger.info("Number of parameters (decoders): %i" % sum(214            [p.numel() for p in decoders[0].parameters() if p.requires_grad]))215        logger.info(f"Number of decoders: {len(decoders)}")...test_unit_reload.py
Source:test_unit_reload.py  
1#!/usr/bin/env python2import os3import unittest2 as unittest4from gppylib.mainUtils import ExceptionNoStackTraceNeeded5from gppylib.operations.reload import GpReload6from mock import MagicMock, Mock, mock_open, patch7class GpReloadTestCase(unittest.TestCase):8    def setUp(self):9        class Options:10            def __init__(self):11                if 'PGPORT' not in os.environ:12                    self.port = None13                else:14                    self.port = os.environ['PGPORT']15                self.table_file = '/tmp/table_file'16                self.database = 'testdb'17                self.interactive = False18        args = None19        self.reload = GpReload(Options(), args)20    def tearDown(self):21        if self.reload.table_file and os.path.exists(self.reload.table_file):22            os.remove(self.reload.table_file)23    def test_validate_options_table_file_not_specified(self):24        self.reload.table_file = None25        with self.assertRaisesRegexp(ExceptionNoStackTraceNeeded, 'Please specify table file'):26            self.reload.validate_options()27    @patch('os.path.exists', return_value=False)28    def test_validate_options_table_file_does_not_exist(self, mock1):29        with self.assertRaisesRegexp(ExceptionNoStackTraceNeeded, 'Unable to find table file "/tmp/table_file"'):30            self.reload.validate_options()31    @patch('os.path.exists', return_value=True)32    def test_validate_options_database_not_specified(self, mock1):33        self.reload.database = None34        with self.assertRaisesRegexp(ExceptionNoStackTraceNeeded, 'Please specify the correct database'):35            self.reload.validate_options()36    @patch('os.path.exists', return_value=True)37    @patch('os.environ')38    def test_validate_options_no_port(self, mock1, mock2):39        self.reload.port = None40        with self.assertRaisesRegexp(ExceptionNoStackTraceNeeded, 'Please specify PGPORT using -p option or set PGPORT in the environment'):41            self.reload.validate_options()42    @patch('os.path.exists', return_value=True)43    def test_validate_options_valid(self, mock1):44        self.reload.validate_options()45    def test_parse_line_empty_table(self):46        line = 'public.:sort_column'47        with self.assertRaises(Exception):48            self.reload.parse_line(line)49    def test_parse_line_empty_schema(self):50        line = '.t1:sort_column'51        with self.assertRaises(Exception):52            self.reload.parse_line(line)53    def test_parse_line_empty_columns(self):54        line = 'public.t1:'55        with self.assertRaises(Exception):56            self.reload.parse_line(line)57    def test_parse_columns_empty_line(self):58        columns = ''59        with self.assertRaisesRegexp(Exception, 'Empty column'):60            self.reload.parse_columns(columns)61    def test_parse_columns_single_column(self):62        columns = 'single_col'63        self.assertEqual([('single_col', 'asc')], self.reload.parse_columns(columns))64    def test_parse_columns_empty_columns(self):65        columns = '   , c2 foo'66        with self.assertRaisesRegexp(Exception, 'Empty column'):67            self.reload.parse_columns(columns)68    def test_parse_column_single_sort_order(self):69        columns = 'single_col asc'70        self.assertEqual([('single_col', 'asc')], self.reload.parse_columns(columns))71    def test_parse_column_invalid_sort_order1(self):72        columns = 'c1, c2 foo'73        with self.assertRaisesRegexp(Exception, 'Invalid sort order foo'):74            self.reload.parse_columns(columns)75    def test_parse_column_invalid_sort_order2(self):76        columns = 'c1, c2 foo bar'77        with self.assertRaisesRegexp(Exception, 'Invalid sort order specified'):78            self.reload.parse_columns(columns)79    def test_validate_table_file_empty_table_name(self):80        self.reload.table_file = '/tmp/table_file'81        with open(self.reload.table_file, 'w') as fp:82            fp.write('public.t1: a, b\n')83            fp.write('public.: a, b\n')84        try:85            with self.assertRaisesRegexp(ExceptionNoStackTraceNeeded, "Line 'public.: a, b' is not formatted correctly"):86                self.reload.validate_table_file()87        finally:88            if os.path.exists(self.reload.table_file):89                os.remove(self.reload.table_file)90    def test_validate_table_file_empty_schema_name(self):91        self.reload.table_file = '/tmp/table_file'92        with open(self.reload.table_file, 'w') as fp:93            fp.write('public.t1: a, b\n')94            fp.write('.t1: a, b\n')95        try:96            with self.assertRaisesRegexp(ExceptionNoStackTraceNeeded, "Line '.t1: a, b' is not formatted correctly"):97                self.reload.validate_table_file()98        finally:99            if os.path.exists(self.reload.table_file):100                os.remove(self.reload.table_file)101    def test_validate_table_file_empty_column_list(self):102        self.reload.table_file = '/tmp/table_file'103        with open(self.reload.table_file, 'w') as fp:104            fp.write('public.t1:\n')105        try:106            with self.assertRaisesRegexp(ExceptionNoStackTraceNeeded, "Line 'public.t1:' is not formatted correctly"):107                self.reload.validate_table_file()108        finally:109            if os.path.exists(self.reload.table_file):110                os.remove(self.reload.table_file)111    def test_validate_table_file_invalid_sort_order(self):112        self.reload.table_file = '/tmp/table_file'113        with open(self.reload.table_file, 'w') as fp:114            fp.write('public.t1: a, b\n')115            fp.write('public.t2: a, b foo\n')116        try:117            with self.assertRaisesRegexp(ExceptionNoStackTraceNeeded, "Line 'public.t2: a, b foo' is not formatted correctly"):118                self.reload.validate_table_file()119        finally:120            if os.path.exists(self.reload.table_file):121                os.remove(self.reload.table_file)122    def test_validate_table_file_valid_data1(self):123        self.reload.table_file = '/tmp/table_file'124        with open(self.reload.table_file, 'w') as fp:125            fp.write('public.t1: a, b\n')126            fp.write('public.t2: a, b\n')127        try:128            expected_output = [('public', 't1', [('a', 'asc'), ('b', 'asc')]), ('public', 't2', [('a', 'asc'), ('b', 'asc')])]129            self.assertEqual(expected_output, self.reload.validate_table_file())130        finally:131            if os.path.exists(self.reload.table_file):132                os.remove(self.reload.table_file)133    def test_validate_table_file_valid_data2(self):134        self.reload.table_file = '/tmp/table_file'135        with open(self.reload.table_file, 'w') as fp:136            fp.write('public.t1: a, b desc\n')137            fp.write('public.t2: a desc, b\n')138        try:139            expected_output = [('public', 't1', [('a', 'asc'), ('b', 'desc')]), ('public', 't2', [('a', 'desc'), ('b', 'asc')])]140            self.assertEqual(expected_output, self.reload.validate_table_file())141        finally:142            if os.path.exists(self.reload.table_file):143                os.remove(self.reload.table_file)144    @patch('gppylib.operations.reload.dbconn.connect')145    @patch('gppylib.operations.reload.execSQLForSingleton', return_value=0)146    def test_validate_table_invalid_table(self, mock1, mock2):147        with self.assertRaisesRegexp(ExceptionNoStackTraceNeeded, "Table public.t1 does not exist"):148            self.reload.validate_table('public', 't1')149    @patch('gppylib.operations.reload.dbconn.connect')150    @patch('gppylib.operations.reload.execSQLForSingleton', return_value=1)151    def test_validate_table_valid_table(self, mock1, mock2):152        self.reload.validate_table('public', 't1')153    @patch('gppylib.operations.reload.dbconn.connect')154    def test_validate_columns_invalid_column(self, mock1):155        m = Mock()156        m.fetchall.return_value=[['a', 'x'], ['b', 'y']]157        with patch('gppylib.operations.reload.execSQL', return_value=m) as p:158            with self.assertRaisesRegexp(ExceptionNoStackTraceNeeded, 'Table public.t1 does not have column c'):159                self.reload.validate_columns('public', 't1', [('a', 'x'), ('b', 'y'), ('c', 'z')])160    @patch('gppylib.operations.reload.dbconn.connect')161    def test_validate_columns_valid_column1(self, mock1):162        m = Mock()163        m.fetchall.return_value=[['a', 'x'], ['b', 'y'], ['c', 'z']]164        with patch('gppylib.operations.reload.execSQL', return_value=m) as p:165            self.reload.validate_columns('public', 't1', [('a', 'x'), ('b', 'y'), ('c', 'z')])166    @patch('gppylib.operations.reload.dbconn.connect')167    def test_validate_columns_valid_column2(self, mock1):168        m = Mock()169        m.fetchall.return_value=[['a', 'w'], ['b', 'x'], ['c', 'y'], ['d', 'z']]170        with patch('gppylib.operations.reload.execSQL', return_value=m) as p:171            self.reload.validate_columns('public', 't1', [('a', 'w'), ('b', 'x'), ('c', 'y'), ('d', 'z')])172    @patch('gppylib.operations.reload.execSQLForSingleton', return_value=0)173    @patch('gppylib.operations.reload.dbconn.connect')174    def test_check_indexes_no_indexes(self, mock1, mock2):175        self.assertTrue(self.reload.check_indexes('public', 't1'))176    @patch('gppylib.operations.reload.ask_yesno', return_value=True)177    @patch('gppylib.operations.reload.dbconn.connect')178    @patch('gppylib.operations.reload.execSQLForSingleton', return_value=1)179    def test_check_indexes_with_indexes_with_continue(self, mock1, mock2, mock3):180        self.reload.interactive=True181        self.assertTrue(self.reload.check_indexes('public', 't1'))182    @patch('gppylib.operations.reload.ask_yesno', return_value=False)183    @patch('gppylib.operations.reload.dbconn.connect')184    @patch('gppylib.operations.reload.execSQLForSingleton', return_value=1)185    def test_check_indexes_with_indexes_without_continue(self, mock1, mock2, mock3):186        self.reload.interactive=True187        self.assertFalse(self.reload.check_indexes('public', 't1'))188    @patch('gppylib.operations.reload.dbconn.connect')189    @patch('gppylib.operations.reload.execSQL', side_effect=[[('public', 'x1')], [('public', 'x2')]])190    def test_get_parent_partition_map(self, mock1, mock2):191        expected = {('public', 't1'): ('public', 'x1'), ('public', 't2'): ('public', 'x2')}192        self.reload.table_list = [('public', 't1', 'a b c d'), ('public', 't2', 'd e f g')]193        self.assertEqual(expected, self.reload.get_parent_partitions())194    @patch('gppylib.operations.reload.dbconn.connect') 195    @patch('gppylib.operations.reload.execSQL', side_effect=[[('public', 'x1')], []])196    def test_get_parent_partition_map_non_partition(self, mock1, mock2):197        expected = {('public', 't1'): ('public', 'x1'), ('public', 't2'): ('public', 't2')}198        self.reload.table_list = [('public', 't1', 'a b c d'), ('public', 't2', 'd e f g')]...migrate.py
Source:migrate.py  
...128    log.debug('def_ms=%s' % unicode(def_ms))129    html += "</body></html>"130    return HttpResponse(html)131@csrf_exempt132def gitreload(request, reload_dir=None):133    '''134    This can be used as a github WebHook Service Hook, for reloading of the content repo used by the LMS.135    If reload_dir is not None, then instruct the xml loader to reload that course directory.136    '''137    html = "<html><body>"138    ip = getip(request)139    html += '<h3>IP address: %s ' % ip140    html += '<h3>User: %s ' % request.user141    ALLOWED_IPS = []  	# allow none by default142    if hasattr(settings, 'ALLOWED_GITRELOAD_IPS'):  	# allow override in settings143        ALLOWED_IPS = settings.ALLOWED_GITRELOAD_IPS144    if not (ip in ALLOWED_IPS or 'any' in ALLOWED_IPS):145        if request.user and request.user.is_staff:146            log.debug(u'request allowed because user=%s is staff', request.user)...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!!
