Best Python code snippet using playwright-python
evaluate_route.py
Source:evaluate_route.py  
1from flask import render_template, redirect, request, url_for, session2from werkzeug.utils import secure_filename3from opennlu import app4from opennlu.services import rasa_service 5from rasa.nlu.model import Interpreter6import os7import json8910DATA_FOLDER = os.path.join('opennlu/data','data')11app.config['DATA_FOLDER'] = DATA_FOLDER12PLOTS_FOLDER = os.path.join('opennlu/static', 'plots') # for file check13app.config['PLOTS_FOLDER'] = PLOTS_FOLDER14PLOT_FOLDER = os.path.join('/static', 'plots') # for image openning (relative path)15app.config['PLOT_FOLDER'] = PLOT_FOLDER1617PT_CACHE_FOLDER = os.path.join(os.getcwd(),'cached_data')1819#Redirect according to current model type20@app.route('/evaluate', methods = ['GET', 'POST'])21def evaluate():22    if 'model_type' in session:23        if session['model_type'] == 'rasa':24            return redirect(url_for('evaluate_rasa'))25        elif session['model_type'] == 'pytorch':26            return redirect(url_for('evaluate_pytorch'))27        else: # session['model_type'] == 'tensorflow'28            return redirect(url_for('evaluate_tensorflow'))29    else: #no models trained yet30        return redirect(url_for('model',fail=True))313233#Evaluate & Test interface for rasa model34@app.route('/evaluate/rasa', methods = ['GET', 'POST'])35def evaluate_rasa():36    if request.method == 'POST':37        #Interpret single message38        if 'interpret' in request.form:39            #Get rasa model40            rasa = app.config['RASA'].get_model(session['model_name'])41            #Perform interpretation42            session['msg'] = request.form['msg']43            result = rasa.results(session['msg'])44            session['results'] = json.dumps(result, indent=2)45            session['intent_name'] = result['intent']['name'] #extract info from nested dict46            session['intent_score'] = result['intent']['confidence']47            entities = result['entities']48            if len(entities) != 0:49                session['entity_names'] = [item['value'] for idx, item in enumerate(entities)] #convert dict to list50                session['entity_types'] = [item['entity'] for idx, item in enumerate(entities)]51                session['entity_scores'] = [item['confidence'] for idx, item in enumerate(entities)]52                session['entity_extractors'] = [item['extractor'] for idx, item in enumerate(entities)]53            else: #no entities found54                session['entity_names'] = ['-nil-']55                session['entity_types'] = ['-nil-']56                session['entity_scores'] = ['-']57                session['entity_extractors'] = ['-nil-']58        #Test data set59        else:60            test_data = request.files['testfile']61            test_filename = os.path.join(app.config['DATA_FOLDER'], test_data.filename)62            test_data.save(os.path.join(app.config['DATA_FOLDER'],secure_filename(test_data.filename))) #store in data folder63            with open(test_filename, "r") as f:64                session['test_data'] = f.read()65                session['test_name'] = test_filename66            #Get rasa model67            rasa = app.config['RASA'].get_model(session['model_name'])68            #Peform evaluation & get results69            [session['int_metrics'], session['ent_metrics'], session['int_results'], session['ent_results']] = rasa.evaluate_metrics(test_filename)            70            session['list_size'] = len(session['int_results'][0]) 71            #Plot confusion matrix and histogram72            basename = os.path.basename(session['test_name'])73            cf_name = session['model_name'] + '_' + os.path.splitext(basename)[0] + '_cf.png'74            hist_name = session['model_name'] + '_' + os.path.splitext(basename)[0] + '_hist.png'75            session['cf_path'] = os.path.join(app.config['PLOTS_FOLDER'], cf_name)76            session['hist_path'] = os.path.join(app.config['PLOTS_FOLDER'], hist_name)77            if os.path.isfile(session['cf_path']):78                os.remove(session['cf_path'])79            if os.path.isfile(session['hist_path']): 80                os.remove(session['hist_path']) 81            rasa.compute_confusion_matrix(session['cf_path']) #hist and cf stored in static/plots folder82            rasa.compute_histogram(session['hist_path'])83            [intent_report, entity_report] = rasa.evaluation_get_individual_report()84            session['intent_report'] = json.dumps(intent_report, indent=2)85            session['entity_report'] = json.dumps(entity_report, indent=2)8687        #Pre-process: copy data from previous load (if any)88        if 'msg' not in session:89            session['msg'] = ""90        if 'intent_name' not in session:91            session['intent_name'] = ""92            session['intent_score'] = ""93            session['entity_names'] = ""94            session['entity_types'] = ""95            session['entity_scores'] = ""96            session['entity_extractors'] = ""97            session['results'] = ""98        99        #Dictionary to pass to view for single msg interpretation100        msg_chunk = {101            'intent_name':session['intent_name'],102            'intent_score':session['intent_score'],103            'entity_names':session['entity_names'],104            'entity_types':session['entity_types'],105            'entity_scores':session['entity_scores'],106            'entity_extractors':session['entity_extractors'],107            'results':session['results'],108            'msg':session['msg']109        }110        #Dictionary to pass to view for testing111        if 'test_data' not in session:112            test_chunk = {113            }114        else:115            test_chunk = {116                'int_metrics':session['int_metrics'],117                'ent_metrics':session['ent_metrics'],118                'int_results':session['int_results'],119                'ent_results':session['ent_results'],120                'list_size':session['list_size'],121                'hist_path':os.path.join(app.config['PLOT_FOLDER'], hist_name),122                'cf_path':os.path.join(app.config['PLOT_FOLDER'], cf_name),123                'int_report':session['intent_report'],124                'ent_report':session['entity_report']125            }126        return render_template('/evaluate/rasa.html', **msg_chunk, **test_chunk)127    else:128        #Clear session variables (when loading url directly)129        msg_list = ['msg', 'intent_name', 'entity_names', 'intent_score', 'entity_scores', 'entity_types', 'entity_extractors', 'results']130        for key in msg_list:131            if key in session:132                session.pop(key)133134        test_list = ['test_data', 'test_name', 'int_metrics', 'ent_metrics', 'int_results', 'ent_results', 'list_size', 'hist_path', 'cf_path', 'intent_report', 'entity_report']135        for key in test_list:136            if key in session:137                session.pop(key)138139        #Check if model is loaded140        if app.config['RASA'].size() == 0:141            return redirect(url_for('model',fail=True))142        else:143            return render_template('/evaluate/rasa.html')144145146#Evaluate & Test interface for pytorch model147@app.route('/evaluate/pytorch', methods = ['GET', 'POST'])148def evaluate_pytorch():149    if request.method == 'POST':150        #Interpret single message151        if 'interpret' in request.form:152            #Get pytorch model153            pytorch = app.config['PT'].get_model(session['model_name'])154            #Perform interpretation155            session['msg'] = request.form['msg']156            [intent, slot, confid_score] = pytorch.predict(session['msg'])157            session['intent_msg'] = intent158            session['slot_msg'] = slot159            session['score'] = str(confid_score)160        else:161            #download multiple files from the folder162            list_folder = request.files.getlist('test_folder') #list()163            #check if folder contains correct files164            file_check = {'label':0, 'seq.in':0, 'seq.out':0}165            for file in list_folder:166                if os.path.basename(file.filename) in file_check:167                    file_check[os.path.basename(file.filename)] = file_check[os.path.basename(file.filename)] + 1           168            if 0 in file_check.values(): #check if filenames meet requirement169                fail = True170                fail_message = 'Files uploaded do not match filename requirements. Please check if your label, text sequence and BIO-tag sequence files are named as label, seq.in and seq.out respectively for system to recognise.'171                return redirect(url_for('evaluate_pytorch',fail=fail,fail_message=fail_message))172            elif not all([False for value in file_check.values() if value>1]): #invalid data folder: contains more than one of each label,seq.in,seq.out files173                fail = True174                fail_message = 'Invalid folder selected! Folder contains more than required number of files (3). Please select the direct parent data folder with only one instance of label, seq.in and seq.out file.'175                return redirect(url_for('evaluate_pytorch',fail=fail,fail_message=fail_message))176            else: 177                # extract data from files178                for file in list_folder:179                    if os.path.basename(file.filename) == 'label':180                        file.seek(0)181                        test_label_name = file.filename182                        test_label_content = file.read().decode("utf-8")183                    elif os.path.basename(file.filename) == 'seq.in':184                        file.seek(0)185                        test_text_name = file.filename186                        test_text_content = file.read().decode("utf-8")187                    elif os.path.basename(file.filename) == 'seq.out':188                        file.seek(0)189                        test_tags_name = file.filename190                        test_tags_content = file.read().decode("utf-8")191192                # check if file content satisfy requirements193                len_label = len(test_label_content.splitlines())194                text_ex = test_text_content.splitlines()195                len_text = len(text_ex)196                tags_ex = test_tags_content.splitlines()197                len_tags = len(tags_ex)198                #check if no. of training examples tally199                if ((len_label != len_text) or (len_label != len_tags)): 200                    fail = True201                    fail_message = 'Number of training examples do not match across the 3 files. Please navigate to edit data page for correction.'202                    return redirect(url_for('evaluate_pytorch',fail=fail,fail_message=fail_message))203                #check for each example if token count tally204                for text, tags in zip(text_ex,tags_ex):205                    if len(text.split()) != len(tags.split()):206                        fail = True207                        fail_message = 'Number of word tokens do not match number of tags in BIO-tag sequence. Please navigate to edit data page for correction'208                        return redirect(url_for('evaluate_pytorch',fail=fail,fail_message=fail_message))209210                # data safe to save211                test_folder_path = os.path.join(app.config['DATA_FOLDER'],os.path.dirname(test_label_name))212                213                if not os.path.exists(test_folder_path): 214                    os.makedirs(test_folder_path)215                label_file = os.path.join(test_folder_path,'label')216                with open(label_file, "w") as f: 217                    f.write(test_label_content)218                text_file = os.path.join(test_folder_path,'seq.in')219                with open(text_file, "w") as f: 220                    f.write(test_text_content)221                tags_file = os.path.join(test_folder_path,'seq.out')222                with open(tags_file, "w") as f: 223                    f.write(test_tags_content)224225                session['test_data'] = test_text_content.splitlines()226227                # copy data to cached folder228                from shutil import copyfile229                new_location = os.path.join(PT_CACHE_FOLDER,session['model_name'])230231                if not os.path.exists(new_location):232                    os.makedirs(new_location) # create (task) folder233                    os.makedirs(os.path.join(new_location,'test')) # create testing folder234                elif not os.path.exists(os.path.join(new_location,'test')):235                    os.makedirs(os.path.join(new_location,'test')) # create testing folder236237                copyfile(os.path.join(test_folder_path,'label'),os.path.join(os.path.join(new_location,'test'),'label'))238                copyfile(os.path.join(test_folder_path,'seq.in'),os.path.join(os.path.join(new_location,'test'),'seq.in'))239                copyfile(os.path.join(test_folder_path,'seq.out'),os.path.join(os.path.join(new_location,'test'),'seq.out'))   240241                # Evaluation:242                #get pytorch model243                pytorch = app.config['PT'].get_model(session['model_name'])244                #peform evaluation & get results245                [session['metrics'], session['int_pred'], session['int_true'], session['slot_pred'], session['slot_true'], confid_score] = pytorch.evaluate()246                ### metrics : loss, intent_accuracy, intent_precision, intent_recall, intent_f1, slot_accuracy, slot_precision, slot_recall, slot_f1, sementic_frame_acc247                session['confid_score'] = [str(score) for score in confid_score]248                [intent_report, slot_report] = pytorch.evaluation_get_individual_report()249                session['intent_report'] = json.dumps(intent_report, indent=2)250                session['slot_report'] = json.dumps(slot_report, indent=2)251                session['list_size'] = len(session['int_true']) 252                #plot confusion matrix and histogram253                basename = os.path.basename(test_folder_path)254                cf_name = session['model_name'] + '_' + basename + '_cf.png'255                hist_name = session['model_name'] + '_' + basename + '_hist.png'256                session['cf_path'] = os.path.join(app.config['PLOTS_FOLDER'], cf_name)257                session['hist_path'] = os.path.join(app.config['PLOTS_FOLDER'], hist_name)258                if os.path.isfile(session['cf_path']):259                    os.remove(session['cf_path'])260                if os.path.isfile(session['hist_path']): 261                    os.remove(session['hist_path']) 262                pytorch.compute_confusion_matrix(session['cf_path']) #cf and hist stored in static/plots folder263                pytorch.compute_histogram(session['hist_path'])264265        #Pre-process: copy data from previous load (if any)266        if 'msg' not in session:267            session['msg'] = ""268        if 'intent_msg' not in session:269            session['intent_msg'] = ""270            session['slot_msg'] = ""271            session['score'] = ""272        273        #Dictionary to pass to view for single msg interpretation274        msg_chunk = {275            'intent_msg':session['intent_msg'],276            'slot_msg':session['slot_msg'],277            'msg':session['msg'],278            'score':session['score']279        }280        #Dictionary to pass to view for testing281        if 'test_data' not in session:282            test_chunk = {283            }284        else:285            test_chunk = {286                'test_data': session['test_data'],287                'metrics': session['metrics'],288                'int_pred': session['int_pred'], 289                'int_true': session['int_true'], 290                'slot_pred': session['slot_pred'], 291                'slot_true': session['slot_true'],292                'list_size': session['list_size'],293                'cf_path': os.path.join(app.config['PLOT_FOLDER'], cf_name),  294                'hist_path': os.path.join(app.config['PLOT_FOLDER'], hist_name), 295                'int_report': session['intent_report'],296                'slot_report': session['slot_report'],297                'confid_score': session['confid_score']298            }299        return render_template('/evaluate/pytorch.html', **msg_chunk, **test_chunk)300301    else:302        #Clear session variables (when loading url directly)303        msg_list = ['msg', 'intent_msg', 'slot_msg', 'score']304        for key in msg_list:305            if key in session:306                session.pop(key)307308        test_list = ['test_data', 'metrics', 'int_pred', 'int_true', 'slot_pred', 'slot_true', 'list_size', 'cf_path', 'hist_path', 'intent_report', 'slot_report', 'confid_score']309        for key in test_list:310            if key in session:311                session.pop(key)312        313        #Check if model is loaded314        if app.config['PT'].size() == 0:315            return redirect(url_for('model',fail=True))316        else:317            if 'fail' in request.args:318                fail = request.args['fail']319                fail_message = request.args['fail_message']320                return render_template('/evaluate/pytorch.html',fail=fail,fail_message=fail_message)321            else:    322                return render_template('/evaluate/pytorch.html')323324325#Evaluate & Test interface for tensorflow model326@app.route('/evaluate/tensorflow', methods = ['GET', 'POST'])327def evaluate_tensorflow():328    if request.method == 'POST':329         #Interpret single message330        if 'interpret' in request.form:331            #Get tensorflow model332            tensorflow = app.config['TF'].get_model(session['model_name'])333            #Perform interpretation334            session['msg'] = request.form['msg']335            response = tensorflow.predict(session['msg'])336337            session['intent_msg'] = response['intent']['name']338            session['slot_msg'] = response['slots']339            session['score'] = response['intent']['confidence']340341        else:342            #download multiple files from the folder343            list_folder = request.files.getlist('test_folder') #list()344            #check if folder contains correct files345            file_check = {'label':0, 'seq.in':0, 'seq.out':0}346            for file in list_folder:347                if os.path.basename(file.filename) in file_check:348                    file_check[os.path.basename(file.filename)] = file_check[os.path.basename(file.filename)] + 1           349            if 0 in file_check.values(): #check if filenames meet requirement350                fail = True351                fail_message = 'Files uploaded do not match filename requirements. Please check if your label, text sequence and BIO-tag sequence files are named as label, seq.in and seq.out respectively for system to recognise.'352                return redirect(url_for('tensorflow',fail=fail,fail_message=fail_message))353            elif not all([False for value in file_check.values() if value>1]): #invalid data folder: contains more than one of each label,seq.in,seq.out files354                fail = True355                fail_message = 'Invalid folder selected! Folder contains more than required number of files (3). Please select the direct parent data folder with only one instance of label, seq.in and seq.out file.'356                return redirect(url_for('tensorflow',fail=fail,fail_message=fail_message))357            else: 358                # extract data from files359                for file in list_folder:360                    if os.path.basename(file.filename) == 'label':361                        file.seek(0)362                        test_label_name = file.filename363                        test_label_content = file.read().decode("utf-8")364                    elif os.path.basename(file.filename) == 'seq.in':365                        file.seek(0)366                        test_text_name = file.filename367                        test_text_content = file.read().decode("utf-8")368                    elif os.path.basename(file.filename) == 'seq.out':369                        file.seek(0)370                        test_tags_name = file.filename371                        test_tags_content = file.read().decode("utf-8")372373                # check if file content satisfy requirements374                len_label = len(test_label_content.splitlines())375                text_ex = test_text_content.splitlines()376                len_text = len(text_ex)377                tags_ex = test_tags_content.splitlines()378                len_tags = len(tags_ex)379                #check if no. of training examples tally380                if ((len_label != len_text) or (len_label != len_tags)): 381                    fail = True382                    fail_message = 'Number of training examples do not match across the 3 files. Please navigate to edit data page for correction.'383                    return redirect(url_for('tensorflow',fail=fail,fail_message=fail_message))384                #check for each example if token count tally385                for text, tags in zip(text_ex,tags_ex):386                    if len(text.split()) != len(tags.split()):387                        fail = True388                        fail_message = 'Number of word tokens do not match number of tags in BIO-tag sequence. Please navigate to edit data page for correction'389                        return redirect(url_for('tensorflow',fail=fail,fail_message=fail_message))390391                # data safe to save392                test_folder_path = os.path.join(app.config['DATA_FOLDER'],os.path.dirname(test_label_name))393                394                if not os.path.exists(test_folder_path): 395                    os.makedirs(test_folder_path)396                label_file = os.path.join(test_folder_path,'label')397                with open(label_file, "w") as f: 398                    f.write(test_label_content)399                text_file = os.path.join(test_folder_path,'seq.in')400                with open(text_file, "w") as f: 401                    f.write(test_text_content)402                tags_file = os.path.join(test_folder_path,'seq.out')403                with open(tags_file, "w") as f: 404                    f.write(test_tags_content)405406                test_data = test_text_content.splitlines()407                session['test_data'] = test_folder_path408409                # Evaluation:410                #get tensorflow model411                tensorflow = app.config['TF'].get_model(session['model_name'])412                #peform evaluation & get results413                [metrics, predicted_intents, true_intents, predicted_tags, true_tags, confid_score] = tensorflow.evaluate(test_folder_path)414                ### metrics : intent_accuracy, intent_precision, intent_recall, intent_f1, slot_accuracy, slot_precision, slot_recall, slot_f1415                confid_score = [str(score) for score in confid_score]416                417                [intent_report, slot_report] = tensorflow.evaluation_get_individual_report()418                session['intent_report'] = json.dumps(intent_report, indent=2)419                session['slot_report'] = json.dumps(slot_report, indent=2)420                421                session['list_size'] = len(true_intents) 422                #plot confusion matrix & histogram423                basename = os.path.basename(test_folder_path)424                cf_name = session['model_name'] + '_' + basename + '_cf.png'425                hist_name = session['model_name'] + '_' + basename + '_hist.png'426                session['cf_path'] = os.path.join(app.config['PLOTS_FOLDER'], cf_name)427                session['hist_path'] = os.path.join(app.config['PLOTS_FOLDER'], hist_name)428                if os.path.isfile(session['cf_path']):429                    os.remove(session['cf_path'])430                if os.path.isfile(session['hist_path']): 431                    os.remove(session['hist_path']) 432                tensorflow.compute_confusion_matrix(session['cf_path']) #cf and hist stored in static/plots folder433                tensorflow.compute_histogram(session['hist_path'])434435        #Pre-process: copy data from previous load (if any)436        if 'msg' not in session:437            session['msg'] = ""438        if 'intent_msg' not in session:439            session['intent_msg'] = ""440            session['slot_msg'] = ""441            session['score'] = ""442        443        #Dictionary to pass to view for single msg interpretation444        msg_chunk = {445            'intent_msg':session['intent_msg'],446            'slot_msg':session['slot_msg'],447            'msg':session['msg'],448            'score':session['score']449        }450        #Dictionary to pass to view for testing451        if 'test_data' not in session:452            test_chunk = {453            }454        else:455            test_chunk = {456                'test_data': test_data,457                'metrics': metrics,458                'int_pred': predicted_intents, 459                'int_true': true_intents, 460                'slot_pred': predicted_tags, 461                'slot_true': true_tags,462                'list_size': session['list_size'],463                'cf_path': os.path.join(app.config['PLOT_FOLDER'], cf_name),  464                'hist_path': os.path.join(app.config['PLOT_FOLDER'], hist_name), 465                'int_report': session['intent_report'],466                'slot_report': session['slot_report'],467                'confid_score': confid_score468            }469        return render_template('/evaluate/tensorflow.html', **msg_chunk, **test_chunk)470        471    else:472        #Clear session variables (when loading url directly)473        msg_list = ['msg', 'intent_msg', 'slot_msg', 'score']474        for key in msg_list:475            if key in session:476                session.pop(key)477478        test_list = ['test_data', 'intent_report', 'slot_report', 'list_size', 'cf_path', 'hist_path']479        for key in test_list:480            if key in session:481                session.pop(key)482483        #Check if model is loaded484        if app.config['TF'].size() == 0:485            return redirect(url_for('model',fail=True))486        else:487            if 'fail' in request.args:488                fail = request.args['fail']489                fail_message = request.args['fail_message']490                return render_template('/evaluate/tensorflow.html',fail=fail,fail_message=fail_message)491            else:    492                return render_template('/evaluate/tensorflow.html')493
...test_gmail_client.py
Source:test_gmail_client.py  
1# coding=utf-82"""3Test Suit for gmail_client.py module4"""5import os6import base647import unittest8from unittest import mock9from ..magen_gmail_client_api import gmail_client10from ..magen_gmail_client_api import config11class TestGmailClient(unittest.TestCase):12    def setUp(self):13        self.test_creds_dir = os.getcwd() + '/.credentials'14        self.env_mock_data = {15            config.GMAIL_CLIENT_ID: 'non-existing-client_id',16            config.GMAIL_CLIENT_SECRET: 'non-existing-client_secret'17        }18    def tearDown(self):19        if os.path.exists(self.test_creds_dir):20            for filename in os.listdir(self.test_creds_dir):21                os.remove(os.path.join(self.test_creds_dir, filename))22            os.rmdir(self.test_creds_dir)23    def test_get_credentials_json(self):24        """25        Test Generation of Credentials for Gmail API based on Environment26        - gmail_client.get_credentials_env() method27        """28        # Generated data with correct environments29        with mock.patch('os.environ', self.env_mock_data):30            credentials_data = gmail_client.get_credentials_env()31            self.assertIn(self.env_mock_data[config.GMAIL_CLIENT_ID], str(credentials_data))32            self.assertIn(self.env_mock_data[config.GMAIL_CLIENT_SECRET], str(credentials_data))33        # KeyError is generated if environments are not set34        with mock.patch('os.environ', {}):35            self.assertRaises(KeyError, gmail_client.get_credentials_env)36    def test_credentials_user_path(self):37        """ Test Generation of directory and correct path creation - gmail_client.credentials_user_path() method """38        with mock.patch('os.path.expanduser') as home_dir_mock:39            home_dir_mock.return_value = os.getcwd()+'/'  # mocking home_dir to tests dir40            # Verify directory does not exists41            self.assertFalse(os.path.exists(self.test_creds_dir))42            # Creating directory43            created_path = gmail_client.credentials_user_path()44            # Verify directory got created45            self.assertTrue(os.path.exists(self.test_creds_dir))46            # Verify path is correctly constructed47            self.assertIn('json', created_path)48            # Calling function again returns the same result49            self.assertEqual(created_path, gmail_client.credentials_user_path())50    @mock.patch('os.path.expanduser')51    @mock.patch('oauth2client.tools.run_flow')52    @mock.patch('oauth2client.client.OAuth2WebServerFlow')53    @mock.patch('oauth2client.file.Storage')54    def test_gmail_credentials(self, store_mock, oauth_mock, run_flow_mock, os_home_dir_mock):55        """ Test Gmail oAuth Credentials generation - gmail_client.gmail_credentials() method """56        os_home_dir_mock.return_value = os.getcwd() + '/'  # mocking home_dir to tests dir57        # mocking `credentials.invalid` of Gmail API58        store_mock.return_value = mock.Mock()59        store_mock.return_value.get.return_value.invalid = False60        result = gmail_client.gmail_credentials()61        self.assertFalse(result.invalid)  # mock returned unchanged62        store_mock.assert_called_once()63        store_mock.return_value.get.return_value = None64        # Verify correctness of the workflow65        with mock.patch('os.environ', new=self.env_mock_data):66            got_credentials = gmail_client.get_credentials_env()67            gmail_client.gmail_credentials()68        oauth_mock.assert_called_once_with(scope=config.SCOPES, **got_credentials['installed'])69        run_flow_mock.assert_called_once_with(oauth_mock.return_value, store_mock.return_value)70        # KeyError should be thrown71        with mock.patch('os.environ', new={}):72            self.assertIsNone(gmail_client.gmail_credentials())  # on KeyError returns None73    @mock.patch('os.path.expanduser')74    def test_cleanup_cache(self, home_dir_mock):75        """ Test cleanup cache data - gmail_client.cleanup_cache() method """76        test_filenames = ['magen-gmail_test', 'test', 'test.json', 'gmail.test']77        home_dir_mock.return_value = os.getcwd() + '/'  # mocking home_dir to tests dir78        # if folder does not exist - plain return79        gmail_client.cleanup_cache()80        creds_path = os.path.dirname(gmail_client.credentials_user_path())  # creating folder81        # add some tests file to the test directory82        for filename in test_filenames:83            with open(os.path.join(creds_path, filename), '+w') as new_file:84                new_file.write('test')  # write some test data85        gmail_client.cleanup_cache()86        # Assertions87        home_dir_mock.assert_called()88        self.assertTrue(os.path.exists(creds_path))89        self.assertNotIn(config.GMAIL_FILES_PREFIX, os.listdir(creds_path))90        self.assertEqual(len(os.listdir(creds_path)), 3)91    def test_create_message(self):92        """ Test message create - gmail_client.create_messsage() method """93        # Prepare94        test_html_content = '''<p>Welcome! Thanks for signing up. Please follow this link to activate your account:</p>95                          <p><a href="some_url">some_url</a></p>96                          <br>97                          <p>Cheers!</p>'''98        test_text_content = 'Please Confirm your email'99        test_sender = 'sender@test.test'100        test_to = 'to@test.test'101        test_subject = 'test'102        # creating email from plain text only103        result_msg = gmail_client.create_message(104            sender=test_sender,105            to=test_to,106            subject=test_subject,107            text_part=test_text_content108        )109        # format required by gmail API110        self.assertIn('raw', result_msg)111        msg_bytes = result_msg['raw'].encode()112        msg_string = base64.urlsafe_b64decode(msg_bytes).decode('utf-8')113        self.assertIn(test_sender, msg_string)114        self.assertIn(test_to, msg_string)115        self.assertIn(test_subject, msg_string)116        self.assertIn(test_text_content, msg_string)117        # creating email from plain text and html content118        result_msg = gmail_client.create_message(119            sender=test_sender,120            to=test_to,121            subject=test_subject,122            text_part=test_text_content,123            html_part=test_html_content124        )125        # format required by gmail API126        self.assertIn('raw', result_msg)127        msg_bytes = result_msg['raw'].encode()128        msg_string = base64.urlsafe_b64decode(msg_bytes).decode('utf-8')129        self.assertIn(test_sender, msg_string)130        self.assertIn(test_to, msg_string)131        self.assertIn(test_subject, msg_string)132        self.assertIn(test_text_content, msg_string)133        self.assertIn(test_html_content, msg_string)134    def test_send_message(self):135        """ Test sending of a message using gmail API """136        test_message = dict(id='test_id')137        gmail_service = mock.Mock()138        gmail_service.users.return_value.messages.return_value.send.return_value.execute.return_value = test_message139        result = gmail_client.send_message(gmail_service, 'here goes email object')140        self.assertIn('id', result)141if __name__ == '__main__':...test_renderer.py
Source:test_renderer.py  
1from md2cf.confluence_renderer import ConfluenceTag, ConfluenceRenderer2def test_add_namespace():3    assert ConfluenceTag.add_namespace("tagname", "namespace") == "namespace:tagname"4def test_tag_append():5    tag = ConfluenceTag("irrelevant")6    other_tag = ConfluenceTag("alsoirrelevant")7    tag.append(other_tag)8    assert tag.children == [other_tag]9def test_tag_render():10    test_tag_type = "structured-macro"11    test_tag_markup = "<ac:structured-macro></ac:structured-macro>\n"12    tag = ConfluenceTag(test_tag_type)13    output = tag.render()14    assert output == test_tag_markup15def test_tag_render_with_text():16    test_tag_type = "structured-macro"17    test_text_content = "This is some text"18    test_tag_markup = "<ac:structured-macro>This is some text</ac:structured-macro>\n"19    tag = ConfluenceTag(test_tag_type, text=test_text_content)20    output = tag.render()21    assert output == test_tag_markup22def test_tag_render_with_cdata_text():23    test_tag_type = "structured-macro"24    test_text_content = "This is some text\nwith newlines"25    test_tag_markup = "<ac:structured-macro><![CDATA[This is some text\nwith newlines]]></ac:structured-macro>\n"26    tag = ConfluenceTag(test_tag_type, text=test_text_content, cdata=True)27    output = tag.render()28    assert output == test_tag_markup29def test_tag_render_with_attribute():30    test_tag_type = "structured-macro"31    test_tag_attrib = {"name": "code"}32    test_tag_markup = '<ac:structured-macro ac:name="code"></ac:structured-macro>\n'33    tag = ConfluenceTag(test_tag_type, attrib=test_tag_attrib)34    output = tag.render()35    assert output == test_tag_markup36def test_tag_render_with_multiple_attributes():37    test_tag_type = "structured-macro"38    test_tag_attrib = {"name": "code", "foo": "bar"}39    test_tag_markup = (40        '<ac:structured-macro ac:foo="bar" ac:name="code"></ac:structured-macro>\n'41    )42    tag = ConfluenceTag(test_tag_type, attrib=test_tag_attrib)43    output = tag.render()44    assert output == test_tag_markup45def test_tag_render_with_child():46    test_tag_type = "structured-macro"47    test_other_tag_type = "unstructured-macro"48    test_tag_markup = "<ac:structured-macro><ac:unstructured-macro></ac:unstructured-macro>\n</ac:structured-macro>\n"49    tag = ConfluenceTag(test_tag_type)50    child_tag = ConfluenceTag(test_other_tag_type)51    tag.children = [child_tag]52    output = tag.render()53    assert output == test_tag_markup54def test_tag_render_with_child_and_text():55    test_tag_type = "structured-macro"56    test_tag_text = "This is some text"57    test_other_tag_type = "unstructured-macro"58    test_tag_markup = "<ac:structured-macro><ac:unstructured-macro></ac:unstructured-macro>\nThis is some text</ac:structured-macro>\n"59    tag = ConfluenceTag(test_tag_type, text=test_tag_text)60    child_tag = ConfluenceTag(test_other_tag_type)61    tag.children = [child_tag]62    output = tag.render()63    assert output == test_tag_markup64def test_renderer_block_code():65    test_code = "this is a piece of code"66    test_markup = (67        '<ac:structured-macro ac:name="code"><ac:parameter ac:name="linenumbers">true</ac:parameter>\n'68        "<ac:plain-text-body><![CDATA[this is a piece of code]]></ac:plain-text-body>\n"69        "</ac:structured-macro>\n"70    )71    renderer = ConfluenceRenderer()72    assert renderer.block_code(test_code) == test_markup73def test_renderer_block_code_with_language():74    test_code = "this is a piece of code"75    test_language = "whitespace"76    test_markup = (77        '<ac:structured-macro ac:name="code"><ac:parameter ac:name="language">whitespace</ac:parameter>\n'78        '<ac:parameter ac:name="linenumbers">true</ac:parameter>\n'79        "<ac:plain-text-body><![CDATA[this is a piece of code]]></ac:plain-text-body>\n"80        "</ac:structured-macro>\n"81    )82    renderer = ConfluenceRenderer()83    assert renderer.block_code(test_code, lang=test_language) == test_markup84def test_renderer_header_sets_title():85    test_header = "this is a header"86    renderer = ConfluenceRenderer()87    renderer.header(test_header, 1)88    assert renderer.title == test_header89def test_renderer_header_lower_level_does_not_set_title():90    test_header = "this is a header"91    renderer = ConfluenceRenderer()92    renderer.header(test_header, 2)93    assert renderer.title is None94def test_renderer_header_later_level_sets_title():95    test_lower_header = "this is a lower header"96    test_header = "this is a header"97    renderer = ConfluenceRenderer()98    renderer.header(test_lower_header, 2)99    renderer.header(test_header, 1)100    assert renderer.title is test_header101def test_renderer_header_only_sets_first_title():102    test_header = "this is a header"103    test_second_header = "this is another header"104    renderer = ConfluenceRenderer()105    renderer.header(test_header, 1)106    renderer.header(test_second_header, 1)107    assert renderer.title is test_header108def test_renderer_image_external():109    test_image_src = "http://example.com/image.jpg"110    test_image_markup = (111        '<ac:image ac:alt=""><ri:url ri:value="{}"></ri:url>\n'112        "</ac:image>\n".format(test_image_src)113    )114    renderer = ConfluenceRenderer()115    assert renderer.image(test_image_src, "", "") == test_image_markup116    assert not renderer.attachments117def test_renderer_image_external_alt_and_title():118    test_image_src = "http://example.com/image.jpg"119    test_image_alt = "alt text"120    test_image_title = "title"121    test_image_markup = (122        '<ac:image ac:alt="{}" ac:title="{}"><ri:url ri:value="{}"></ri:url>\n'123        "</ac:image>\n".format(test_image_alt, test_image_title, test_image_src)124    )125    renderer = ConfluenceRenderer()126    assert (127        renderer.image(test_image_src, test_image_title, test_image_alt)128        == test_image_markup129    )130def test_renderer_image_internal_absolute():131    test_image_file = "image.jpg"132    test_image_src = "/home/test/images/" + test_image_file133    test_image_markup = (134        '<ac:image ac:alt=""><ri:attachment ri:filename="{}"></ri:attachment>\n'135        "</ac:image>\n".format(test_image_file)136    )137    renderer = ConfluenceRenderer()138    assert renderer.image(test_image_src, "", "") == test_image_markup139    assert renderer.attachments == [test_image_src]140def test_renderer_image_internal_relative():141    test_image_file = "image.jpg"142    test_image_src = "test/images/" + test_image_file143    test_image_markup = (144        '<ac:image ac:alt=""><ri:attachment ri:filename="{}"></ri:attachment>\n'145        "</ac:image>\n".format(test_image_file)146    )147    renderer = ConfluenceRenderer()148    assert renderer.image(test_image_src, "", "") == test_image_markup...test_backups.py
Source:test_backups.py  
1import os2import sys3from pathlib import Path4from .testing_utility_functions import BACKUP_DEST_DIR, FAKE_HOME_DIR, DOTFILES, setup_dirs_and_env_vars_and_create_config, clean_up_dirs_and_env_vars5sys.path.insert(0, "../shallow_backup")6from shallow_backup.backup import backup_dotfiles7from shallow_backup.utils import safe_mkdir8from shallow_backup.config import get_config, write_config9TEST_TEXT_CONTENT = 'THIS IS TEST CONTENT FOR THE DOTFILES'10class TestBackupMethods:11	"""Test the backup methods."""12	@staticmethod13	def setup_method():14		setup_dirs_and_env_vars_and_create_config()15		# Create all dotfiles and dotfolders16		for file in DOTFILES:17			if not file.endswith("/"):18				print(f"Creating file: {file}")19				os.makedirs(Path(file).parent, exist_ok=True)20				with open(file, "w+") as f:21					f.write(TEST_TEXT_CONTENT)22			else:23				directory = file24				print(f"Creating dir: {directory}")25				safe_mkdir(directory)26				for file_2 in ["test1", "test2"]:27					with open(os.path.join(directory, file_2), "w+") as f:28						f.write(TEST_TEXT_CONTENT)29	@staticmethod30	def teardown_method():31		clean_up_dirs_and_env_vars()32	def test_backup_dotfiles(self):33		"""Test backing up dotfiles and dotfolders."""34		backup_dest_path = os.path.join(BACKUP_DEST_DIR, "dotfiles")35		backup_dotfiles(backup_dest_path, dry_run=False, home_path=FAKE_HOME_DIR, skip=True)36		assert os.path.isdir(backup_dest_path)37		for path in DOTFILES:38			print(f"\nBACKUP DESTINATION DIRECTORY: ({backup_dest_path}) CONTENTS:", os.listdir(backup_dest_path), "")39			print(path + " should already be backed up.")40			backed_up_dot = os.path.join(backup_dest_path, path.replace(FAKE_HOME_DIR + "/", ""))41			print(f"Backed up dot: {backed_up_dot}\n")42			assert os.path.isfile(backed_up_dot) or os.path.isdir(backed_up_dot)43	def test_conditions(self):44		"""Test backing up files based on conditions"""45		# Set false backup condition of all files.46		config = get_config()47		print(config["dotfiles"])48		for dot, _ in config["dotfiles"].items():49			config["dotfiles"][dot]["backup_condition"] = "[[ $(uname -s) == 'Made Up OS' ]]"50		write_config(config)51		backup_dest_path = os.path.join(BACKUP_DEST_DIR, "dotfiles")52		backup_dotfiles(backup_dest_path, dry_run=False, home_path=FAKE_HOME_DIR, skip=True)53		assert os.path.isdir(backup_dest_path)54		for path in DOTFILES:55			print(f"\nBACKUP DESTINATION DIRECTORY: ({backup_dest_path}) CONTENTS:", os.listdir(backup_dest_path), "")56			print(path + " should not be backed up.")57			backed_up_dot = os.path.join(backup_dest_path, path.replace(FAKE_HOME_DIR + "/", ""))...LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!
