Best Python code snippet using hypothesis
testTools.js
Source:testTools.js  
...8    test(".listSteps()", () => {9        let getStepNames, getStepsData, learnClassifier, filterSteps;10        beforeChunk(() => {11            getStepNames = sinon.stub();12            tools.__set__("getStepNames", getStepNames);13            getStepsData = sinon.stub();14            tools.__set__("getStepsData", getStepsData);15            learnClassifier = sinon.stub();16            tools.__set__("learnClassifier", learnClassifier);17            filterSteps = sinon.stub();18            tools.__set__("filterSteps", filterSteps);19        });20        chunk("gets cached steps", () => {21            tools.__set__("stepsCache", ["my-step"]);22            expect(tools.listSteps()).to.be.eql(["my-step"]);23            expect(getStepNames).to.not.be.called;24            expect(getStepsData).to.not.be.called;25            expect(learnClassifier).to.not.be.called;26            expect(filterSteps).to.not.be.called;27        });28        chunk("gets steps with cache population", () => {29            getStepsData.returns(["my-step"]);30            tools.__set__("stepsCache", null);31            expect(tools.listSteps()).to.be.eql(["my-step"]);32            expect(tools.__get__("stepsCache")).to.be.eql(["my-step"]);33            expect(getStepNames).to.be.calledOnce;34            expect(getStepsData).to.be.calledOnce;35            expect(learnClassifier).to.be.calledOnce;36            expect(learnClassifier.args[0][0]).to.be.eql(["my-step"]);37            expect(filterSteps).to.not.be.called;38        });39        chunk("gets filtered steps", () => {40            filterSteps.returns(["my-another-step"]);41            tools.__set__("stepsCache", ["my-step"]);42            expect(tools.listSteps("another")).to.be.eql(["my-another-step"]);43            expect(filterSteps).to.be.calledOnce;44            expect(filterSteps.args[0]).to.be.eql([["my-step"], "another", false]);45        });46    });47    test(".printSteps()", () => {48        let listSteps, console_, d, highlight;49        beforeChunk(() => {50            listSteps = sinon.stub();51            tools.__set__("listSteps", listSteps);52            console_ = {53                log: sinon.stub(),54            };55            tools.__set__("console", console_);56            d = sinon.stub();57            tools.__set__("d", d);58            highlight = sinon.stub();59            tools.__set__("highlight", highlight);60        });61        chunk("print no steps message", () => {62            listSteps.returns([]);63            tools.printSteps();64            expect(listSteps).to.be.calledOnce;65            expect(listSteps.args[0]).to.be.eql([undefined, false]);66            expect(console_.log).to.be.calledOnce;67            expect(console_.log.args[0][0]).to.include("No steps are found");68            expect(d).to.not.be.called;69        });70        chunk("print steps", () => {71            listSteps.returns([{ name: "my step", description: "my description" }]);72            tools.printSteps();73            expect(console_.log).to.be.calledTwice;74            expect(d).to.be.calledTwice;75            expect(d.args[0][0]).to.include("1. my step:");76            expect(d.args[1][0]).to.include("my description");77            expect(highlight).to.not.be.called;78        });79        chunk("print steps with docs", () => {80            listSteps.returns([{ name: "my step", description: "my description", doc: "/* step docs */" }]);81            tools.printSteps();82            expect(console_.log).to.be.calledThrice;83            expect(highlight).to.be.calledOnce;84            expect(highlight.args[0][0]).to.be.equal("/* step docs */");85            expect(highlight.args[0][1]).to.be.eql({ language: "js" });86        });87    });88    test(".printTests()", () => {89        let fakeLoad, conf, console_;90        beforeChunk(() => {91            fakeLoad = sinon.stub();92            tools.__set__("fakeLoad", fakeLoad);93            conf = {94                test: { cases: [] },95            };96            tools.__set__("CONF", conf);97            console_ = {98                log: sinon.stub(),99            };100            tools.__set__("console", console_);101        });102        chunk("prints no tests message if no tests", () => {103            tools.printTests();104            expect(fakeLoad).to.be.calledOnce;105            expect(console_.log).to.be.calledOnce;106            expect(console_.log.args[0][0]).to.include("No tests are found");107        });108        chunk("prints no tests message if no filtered tests", () => {109            conf.test.cases = [{ name: "my test" }];110            tools.printTests("another test");111            expect(console_.log).to.be.calledOnce;112            expect(console_.log.args[0][0]).to.include("No tests are found");113        });114        chunk("prints tests", () => {115            conf.test.cases = [{ name: "my test" }, { name: "another test" }];116            tools.printTests("my test");117            expect(console_.log).to.be.calledOnce;118            expect(console_.log.args[0][0]).to.include("1. my test");119        });120    });121    test(".printPlugins()", () => {122        let plugins, console_;123        beforeChunk(() => {124            plugins = {125                get: sinon.stub(),126            };127            tools.__set__("plugins", plugins);128            console_ = {129                log: sinon.stub(),130            };131            tools.__set__("console", console_);132        });133        chunk("prints no plugins message", () => {134            plugins.get.returns([]);135            tools.printPlugins();136            expect(console_.log).to.be.calledOnce;137            expect(console_.log.args[0][0]).to.include("No plugins are detected");138        });139        chunk("prints plugins list", () => {140            plugins.get.returns([{ name: "my plugin", path: "/path/to/my/plugin" }]);141            tools.printPlugins();142            expect(console_.log).to.be.calledOnce;143            expect(console_.log.args[0][0]).to.include("1. my plugin");144            expect(console_.log.args[0][1]).to.include("/path/to/my/plugin");145        });146    });147    test(".listFixtures()", () => {148        let fakeLoad, getFixtures, filterFixtures;149        beforeChunk(() => {150            fakeLoad = sinon.stub();151            tools.__set__("fakeLoad", fakeLoad);152            getFixtures = sinon.stub().returns(["my fixture"]);153            tools.__set__("getFixtures", getFixtures);154            filterFixtures = sinon.stub().returns(["another fixture"]);155            tools.__set__("filterFixtures", filterFixtures);156        });157        chunk("gets list of all fixtures", () => {158            expect(tools.listFixtures()).to.be.eql(["my fixture"]);159            expect(fakeLoad).to.be.calledOnce;160            expect(filterFixtures).to.not.be.called;161        });162        chunk("gets list of filtered fixtures", () => {163            expect(tools.listFixtures("another")).to.be.eql(["another fixture"]);164            expect(filterFixtures.args[0]).to.be.eql([["my fixture"], "another", false]);165        });166    });167    test(".printFixtures()", () => {168        let listFixtures, console_, d, highlight;169        beforeChunk(() => {170            listFixtures = sinon.stub();171            tools.__set__("listFixtures", listFixtures);172            console_ = {173                log: sinon.stub(),174            };175            tools.__set__("console", console_);176            d = sinon.stub();177            tools.__set__("d", d);178            highlight = sinon.stub();179            tools.__set__("highlight", highlight);180        });181        chunk("prints no fixtures message", () => {182            listFixtures.returns([]);183            tools.printFixtures();184            expect(console_.log).to.be.calledOnce;185            expect(console_.log.args[0][0]).to.include("No fixtures are found");186        });187        chunk("prints list of fixtures", () => {188            listFixtures.returns([{ name: "my fixture" }]);189            tools.printFixtures();190            191            expect(console_.log).to.be.calledOnce;192            expect(d).to.be.calledOnce;193            expect(d.args[0][0]).to.include("1. my fixture");194        });195        chunk("prints list of fixtures with docs", () => {196            listFixtures.returns([{ name: "my fixture", doc: "/* fixture doc */" }]);197            tools.printFixtures();198            199            expect(console_.log).to.be.calledTwice;200            expect(d).to.be.calledOnce;201            expect(d.args[0][0]).to.include("1. my fixture");202            expect(highlight).to.be.calledOnce;203            expect(highlight.args[0][0]).to.be.equal("/* fixture doc */");204            expect(highlight.args[0][1]).to.be.eql({ language: "js" });205        });206    });207    test(".fakeLoad()", () => {208        let global_, require_;209        beforeChunk(() => {210            global_ = {};211            tools.__set__("global", global_);212            require_ = sinon.stub();213            tools.__set__("require", require_);214        });215        chunk(() => {216            tools.fakeLoad();217            expect(global_.before).to.be.a("function");218            expect(global_.after).to.be.a("function");219            expect(global_.beforeEach).to.be.a("function");220            expect(global_.afterEach).to.be.a("function");221            expect(global_.it).to.be.a("function");222            expect(global_.describe).to.be.a("function");223            expect(require_).to.be.calledTwice;224            expect(require_.args[0][0]).to.be.equal("./globals");225            expect(require_.args[1][0]).to.be.equal("./loader");226        });227    });228    test(".checkTestrail()", () => {229        let checkTestrailOpts, fakeLoad, conf, checkTestrailCases;230        beforeChunk(() => {231            checkTestrailOpts = sinon.stub();232            tools.__set__("checkTestrailOpts", checkTestrailOpts);233            fakeLoad = sinon.stub();234            tools.__set__("fakeLoad", fakeLoad);235            conf = {236                testrail: {237                    host: "http://testrail",238                    user: "user@example.com",239                    token: "1234asdf",240                },241            };242            tools.__set__("CONF", conf);243            checkTestrailCases = sinon.stub();244            tools.__set__("checkTestrailCases", checkTestrailCases);245        });246        chunk(() => {247            const cb = () => {};248            tools.checkTestrail(cb);249            expect(checkTestrailOpts).to.be.calledOnce;250            expect(fakeLoad).to.be.calledOnce;251            expect(checkTestrailCases).to.be.calledOnce;252            expect(checkTestrailCases.args[0][1]).to.be.equal(cb);253            const client = checkTestrailCases.args[0][0];254            expect(client).to.be.an.instanceof(Testrail);255            expect(client.host).to.be.equal("http://testrail");256            expect(client.user).to.be.equal("user@example.com");257            expect(client.password).to.be.equal("1234asdf");258        });259    });260    test("checkTestrailOpts()", () => {261        let checkTestrailOpts, conf;262        before(() => {263            checkTestrailOpts = tools.__get__("checkTestrailOpts");264            conf = {265                testrail: {266                    host: "http://testrail",267                },268            };269            tools.__set__("CONF", conf);270        });271        chunk("passes if options exist", () => {272            checkTestrailOpts();273        });274        chunk("throws if options don't exist", () => {275            conf.testrail.host = null;276            expect(checkTestrailOpts).to.throw(277                "TestRail option 'host' isn't specified in config");278        });279    });280    test("checkTestrailMissed()", () => {281        let checkTestrailMissed, console_, conf;282        beforeChunk(() => {283            checkTestrailMissed = tools.__get__("checkTestrailMissed");284            console_ = {285                log: sinon.stub(),286            };287            tools.__set__("console", console_);288            conf = {289                test: {290                    cases: [{ name: "my case" }],291                },292            };293            tools.__set__("CONF", conf);294        });295        chunk("returns 0 if no missed cases", () => {296            expect(checkTestrailMissed([{ title: "my case" }])).to.be.equal(0);297            expect(console_.log).to.not.be.called;298        });299        chunk("returns 1 if there are missed cases", () => {300            expect(checkTestrailMissed([{ title: "another case" }])).to.be.equal(1);301            expect(console_.log).to.be.calledTwice;302            expect(console_.log.args[0][0]).to.include("Missed TestRail cases");303            expect(console_.log.args[1][0]).to.include("1. my case");304        });305    });306    test("checkTestrailNotImplemented()", () => {307        let checkTestrailNotImplemented, console_, conf;308        beforeChunk(() => {309            checkTestrailNotImplemented = tools.__get__("checkTestrailNotImplemented");310            console_ = {311                log: sinon.stub(),312            };313            tools.__set__("console", console_);314            conf = {315                test: {316                    cases: [{ name: "my case" }],317                },318            };319            tools.__set__("CONF", conf);320        });321        chunk("returns 0 if all cases are implemented", () => {322            expect(checkTestrailNotImplemented([{ title: "my case" }])).to.be.equal(0);323            expect(console_.log).to.not.be.called;324        });325        chunk("returns 1 if there are not implemented cases", () => {326            expect(checkTestrailNotImplemented([{ title: "another case" }])).to.be.equal(1);327            expect(console_.log).to.be.calledTwice;328            expect(console_.log.args[0][0]).to.include("Not implemented TestRail cases");329            expect(console_.log.args[1][0]).to.include("1. another case");330        });331    });332    test("checkTestrailDuplicates()", () => {333        let checkTestrailDuplicates, console_;334        beforeChunk(() => {335            checkTestrailDuplicates = tools.__get__("checkTestrailDuplicates");336            console_ = {337                log: sinon.stub(),338            };339            tools.__set__("console", console_);340        });341        chunk("returns 0 if no missed cases", () => {342            expect(checkTestrailDuplicates([{ title: "my case" }, { title: "another case" }])).to.be.equal(0);343            expect(console_.log).to.not.be.called;344        });345        chunk("returns 1 if there are missed cases", () => {346            expect(checkTestrailDuplicates([{ title: "my case" }, { title: "my case" }])).to.be.equal(1);347            expect(console_.log).to.be.calledTwice;348            expect(console_.log.args[0][0]).to.include("TestRail duplicated cases");349            expect(console_.log.args[1][0]).to.include("1. my case");350        });351    });352    test("checkTestrailCases()", () => {353        let checkTestrailCases, conf, client, console_;354        beforeChunk(() => {355            checkTestrailCases = tools.__get__("checkTestrailCases");356            conf = {357                testrail: {358                    projectId: 1,359                    suiteId: 2,360                    host: "http://testrail",361                },362            };363            tools.__set__("CONF", conf);364            client = {365                getCases: sinon.stub(),366            };367            console_ = {368                log: sinon.stub(),369            };370            tools.__set__("console", console_);371        });372        chunk("calls testrail client", () => {373            checkTestrailCases(client);374            expect(client.getCases).to.be.calledOnce;375            expect(client.getCases.args[0][0]).to.be.equal(1);376            expect(client.getCases.args[0][1]).to.be.eql({ suite_id: 2 });377        });378        scope("callback", () => {379            let cb, callback, checkTestrailDuplicates,380                checkTestrailNotImplemented, checkTestrailMissed;381            beforeChunk(() => {382                cb = sinon.stub();383                checkTestrailCases(client, cb);384                callback = client.getCases.args[0][2];385                checkTestrailDuplicates = sinon.stub();386                tools.__set__("checkTestrailDuplicates", checkTestrailDuplicates);387                checkTestrailNotImplemented = sinon.stub();388                tools.__set__("checkTestrailNotImplemented", checkTestrailNotImplemented);389                checkTestrailMissed = sinon.stub();390                tools.__set__("checkTestrailMissed", checkTestrailMissed);391            });392            chunk("fails if error response", () => {393                callback("response error");394                expect(cb).to.be.calledOnce;395                expect(cb.args[0][0]).to.be.equal(1);396                expect(console_.log).to.be.calledOnce;397                expect(console_.log.args[0][0]).to.be.equal("response error");398            });399            chunk("fails if cases check is failed", () => {400                checkTestrailDuplicates.returns(1);401                checkTestrailNotImplemented.returns(1);402                checkTestrailMissed.returns(1);403                callback();404                expect(cb).to.be.calledOnce;405                expect(cb.args[0][0]).to.be.equal(3);406                expect(console_.log).to.be.calledOnce;407                expect(console_.log.args[0][0]).to.include("TestRail suite is");408            });409            chunk("passes if cases check is passed", () => {410                checkTestrailDuplicates.returns(0);411                checkTestrailNotImplemented.returns(0);412                checkTestrailMissed.returns(0);413                callback();414                expect(cb).to.be.calledOnce;415                expect(cb.args[0][0]).to.be.equal(0);416                expect(console_.log).to.be.calledTwice;417                expect(console_.log.args[0][0]).to.include("cases correspond");418                expect(console_.log.args[1][0]).to.include("TestRail suite is");419            });420        });421    });422    test("getFixtures()", () => {423        let getFixtures;424        beforeChunk(() => {425            getFixtures = tools.__get__("getFixtures");426            const global_ = {427                fxMyFixture: () => {},428                myFixture: () => {},429                fxSomeVar: 5,430            };431            tools.__set__("global", global_);432            tools.__set__("utils", { getDoc: () => "/** fixture docs */" });433        });434        chunk(() => {435            expect(getFixtures()).to.be.eql([{436                name: "fxMyFixture",437                doc: "/** fixture docs */",438            }]);439        });440    });441    test("filterFixtures()", () => {442        let filterFixtures, fixtures;443        beforeChunk(() => {444            filterFixtures = tools.__get__("filterFixtures");445            fixtures = [{446                name: "fx1",447                doc: "doc of fixture 1",448            }, {449                name: "fx2",450                doc: "doc of fixture 2",451            }];452        });453        chunk("returns nothing if filter is mismatched", () => {454            expect(filterFixtures(fixtures, "fixture 1", true)).to.be.eql([]);455        });456        chunk("returns fixtures filtered by name", () => {457            expect(filterFixtures(fixtures, "fx1", true)).to.be.eql([{458                name: "fx1",459                doc: "doc of fixture 1",460            }]);461        });462        chunk("returns fixtures filtered by doc", () => {463            expect(filterFixtures(fixtures, "fixture 1")).to.be.eql([{464                name: "fx1",465                doc: "doc of fixture 1",466            }]);467        });468    });469    test("getStepNames()", () => {470        let getStepNames, global_, fakeLoad;471        beforeChunk(() => {472            getStepNames = tools.__get__("getStepNames");473            global_ = {};474            tools.__set__("global", global_);475            tools.__set__("$", {476                launchBrowser: null,477                closeBrowser: null,478                constructor: null,479                _start: null,480                0: null481            });482            fakeLoad = sinon.stub();483            tools.__set__("fakeLoad", fakeLoad);484        });485        chunk(() => {486            expect(getStepNames()).to.be.eql(["closeBrowser", "launchBrowser"]);487            expect(fakeLoad).to.be.calledOnce;488        });489    });490    test("getStepsData()", () => {491        let getStepsData;492        beforeChunk(() => {493            getStepsData = tools.__get__("getStepsData");494            tools.__set__("$", {495                "my step": () => {},496                "some step": 5,497                "some func": () => {},498            });499            tools.__set__("funcDescription", () => "my step description");500            tools.__set__("utils", { getDoc: () => "my step doc" });501        });502        chunk(() => {503            expect(getStepsData(["my step", "some step"])).to.be.eql([{504                name: "my step",505                description: "my step description",506                doc: "my step doc",507            }]);508        });509    });510    test("filterSteps()", () => {511        let filterSteps, steps, classifySteps, mergeSteps;512        beforeChunk(() => {513            filterSteps = tools.__get__("filterSteps");514            classifySteps = sinon.stub();515            tools.__set__("classifySteps", classifySteps);516            mergeSteps = sinon.stub();517            tools.__set__("mergeSteps", mergeSteps);518            steps = [{519                name: "step1",520                doc: "doc of step 1",521                description: "function () {...}",522            }, {523                name: "step2",524                doc: "doc of step 2",525                description: "function () {...}",526            }];527        });528        chunk("returns nothing if filter is mismatched", () => {529            expect(filterSteps(steps, "doc of step 1", true)).to.be.eql([]);530        });531        chunk("returns steps filtered by name", () => {532            expect(filterSteps(steps, "step1", true)).to.be.eql([{533                name: "step1",534                doc: "doc of step 1",535                description: "function () {...}",536            }]);537        });538        chunk("returns steps filtered by doc", () => {539            mergeSteps.returns([{540                name: "classified step",541                doc: "doc of classified step",542                description: "function () {...}",543            }]);544            expect(filterSteps(steps, "step 1")).to.be.eql([{545                name: "classified step",546                doc: "doc of classified step",547                description: "function () {...}",548            }]);549        });550    });551    test("learnClassifier()", () => {552        let learnClassifier, classifier;553        beforeChunk(() => {554            learnClassifier = tools.__get__("learnClassifier");555            classifier = {556                learn: sinon.stub(),557            };558            tools.__set__("classifier", classifier);559        });560        chunk(() => {561            const steps = [{562                name: "step 1",563                doc: "doc 1",564            }, {565                name: "step 2",566                doc: "doc 2",567            }];568            learnClassifier(steps);569            expect(classifier.learn).to.be.calledTwice;570            expect(classifier.learn.args[0]).to.be.eql(["doc 1", "step 1"]);571            expect(classifier.learn.args[1]).to.be.eql(["doc 2", "step 2"]);572        });573    });574    test("classifySteps()", () => {575        let classifySteps, classifier;576        beforeChunk(() => {577            classifySteps = tools.__get__("classifySteps");578            classifier = {579                classify: sinon.stub(),580            };581            tools.__set__("classifier", classifier);582        });583        chunk(() => {584            const steps = [{585                name: "step 1",586            }, {587                name: "step 2",588            }, {589                name: "step 3",590            }];591            classifier.classify.returns([{ label: "step 2" }]);592            expect(classifySteps(steps, "step 2")).to.be.eql([{593                name: "step 2",594            }]);595        });...testReporterStdout.js
Source:testReporterStdout.js  
...4    let conf, stdout;5    beforeChunk(() => {6        conf = {};7        conf.report = { dir: "/path/to/report" };8        stdoutReporter.__set__("CONF", conf);9        stdout = sinon.stub();10    });11    afterChunk(() => {12        stdoutReporter.__reset__();13    });14    test(".start()", () => {15        let fs, fse;16        beforeChunk(() => {17            fs = {18                createWriteStream: sinon.spy(),19            };20            stdoutReporter.__set__("fs", fs);21            fse = {22                mkdirsSync: sinon.spy(),23            };24            stdoutReporter.__set__("fse", fse);25        });26        chunk("activates stream", () => {27            stdoutReporter.start();28            expect(fse.mkdirsSync).to.be.calledOnce;29            expect(fse.mkdirsSync.args[0][0]).to.be.equal("/path/to/report");30            expect(fs.createWriteStream).to.be.calledOnce;31            expect(fs.createWriteStream.args[0][0]).to.be.equal("/path/to/report/stdout.log");32            expect(fs.createWriteStream.args[0][1]).to.be.eql({ flags: "w" });33        });34    });35    test(".end()", () => {36        let epilogue;37        beforeChunk(() => {38            epilogue = sinon.stub();39            stdoutReporter.__set__("epilogue", epilogue);40            stdoutReporter.__set__("stdout", stdout);41        });42        chunk("finalizes report", () => {43            stdoutReporter.end();44            expect(epilogue).to.be.calledOnce;45            expect(stdout).to.be.calledThrice;46            expect(stdout.args[2][0]).to.include("Local report is /path/to/report");47        });48    });49    test(".scope()", () => {50        beforeChunk(() => {51            stdoutReporter.__set__("stdout", stdout);52            stdoutReporter.__set__("indents", 0);53        });54        chunk("prints scope details", () => {55            stdoutReporter.scope({ title: "my scope" });56            expect(stdout).to.be.calledTwice;57            expect(stdout.args[1][0]).to.be.include("scope: my scope");58        });59        chunk("prints nothing", () => {60            stdoutReporter.__set__("indents", -1);61            stdoutReporter.scope({ title: "my scope" });62            expect(stdout).to.not.be.called;63        });64    });65    test(".scopeEnd()", () => {66        beforeChunk(() => {67            stdoutReporter.__set__("stdout", stdout);68            stdoutReporter.__set__("indents", 1);69        });70        chunk(() => {71            stdoutReporter.scopeEnd();72            expect(stdout).to.be.calledOnce;73        });74    });75    test(".suite()", () => {76        beforeChunk(() => {77            stdoutReporter.__set__("stdout", stdout);78            stdoutReporter.__set__("indents", 0);79        });80        chunk("prints suite details", () => {81            stdoutReporter.suite({ title: "my suite" });82            expect(stdout).to.be.calledTwice;83            expect(stdout.args[1][0]).to.be.include("suite: my suite");84        });85        chunk("prints nothing", () => {86            stdoutReporter.__set__("indents", -1);87            stdoutReporter.suite({ title: "my suite" });88            expect(stdout).to.not.be.called;89        });90    });91    test(".suiteEnd()", () => {92        beforeChunk(() => {93            stdoutReporter.__set__("stdout", stdout);94            stdoutReporter.__set__("indents", 1);95        });96        chunk(() => {97            stdoutReporter.suiteEnd();98            expect(stdout).to.be.calledOnce;99        });100    });101    test(".test()", () => {102        beforeChunk(() => {103            stdoutReporter.__set__("stdout", stdout);104            stdoutReporter.__set__("indents", 0);105        });106        chunk("prints test details", () => {107            stdoutReporter.test({ title: "my test" });108            expect(stdout).to.be.calledTwice;109            expect(stdout.args[1][0]).to.be.include("test: my test");110        });111        chunk("prints nothing", () => {112            stdoutReporter.__set__("indents", -1);113            stdoutReporter.test({ title: "my test" });114            expect(stdout).to.not.be.called;115        });116    });117    test(".testEnd()", () => {118        beforeChunk(() => {119            stdoutReporter.__set__("stdout", stdout);120            stdoutReporter.__set__("indents", 1);121        });122        chunk(() => {123            stdoutReporter.testEnd();124            expect(stdout).to.be.calledOnce;125        });126    });127    test(".pass()", () => {128        beforeChunk(() => {129            stdoutReporter.__set__("stdout", stdout);130        });131        chunk("prints chunk with name", () => {132            stdoutReporter.pass({ title: "my chunk" });133            expect(stdout).to.be.calledOnce;134            expect(stdout.args[0][0]).to.include("â chunk: my chunk");135        });136        chunk("prints chunk without name", () => {137            stdoutReporter.pass({});138            expect(stdout).to.be.calledOnce;139            expect(stdout.args[0][0]).to.include("â chunk");140            expect(stdout.args[0][0]).to.not.include("â chunk:");141        });142    });143    test(".skip()", () => {144        beforeChunk(() => {145            stdoutReporter.__set__("stdout", stdout);146        });147        chunk("prints chunk with name", () => {148            stdoutReporter.skip({ title: "my chunk" });149            expect(stdout).to.be.calledOnce;150            expect(stdout.args[0][0]).to.include("# chunk: my chunk");151        });152        chunk("prints chunk without name", () => {153            stdoutReporter.skip({});154            expect(stdout).to.be.calledOnce;155            expect(stdout.args[0][0]).to.include("# chunk");156            expect(stdout.args[0][0]).to.not.include("# chunk:");157        });158    });159    test(".fail()", () => {160        beforeChunk(() => {161            stdoutReporter.__set__("stdout", stdout);162        });163        chunk("prints chunk with name", () => {164            stdoutReporter.fail({ title: "my chunk" });165            expect(stdout).to.be.calledOnce;166            expect(stdout.args[0][0]).to.include("â chunk: my chunk");167        });168        chunk("prints chunk without name", () => {169            stdoutReporter.fail({});170            expect(stdout).to.be.calledOnce;171            expect(stdout.args[0][0]).to.include("â chunk");172            expect(stdout.args[0][0]).to.not.include("â chunk:");173        });174        chunk("prints chunk without name", () => {175            stdoutReporter.fail({ type: "hook" });176            expect(stdout).to.be.calledOnce;177            expect(stdout.args[0][0]).to.include("â hook");178            expect(stdout.args[0][0]).to.not.include("â hook:");179        });180        chunk("prints test error", () => {181            conf.report.errorsNow = true;182            conf.test = { curCase: { errors: ["test error"] }};183            stdoutReporter.fail({});184            expect(stdout).to.be.calledTwice;185            expect(stdout.args[1][0]).to.include("test error");186        });187        chunk("prints session error", () => {188            conf.report.errorsNow = true;189            conf.test = {};190            conf.session = { errors: ["session error"] };191            stdoutReporter.fail({});192            expect(stdout).to.be.calledTwice;193            expect(stdout.args[1][0]).to.include("session error");194        });195    });196    test(".done()", () => {197        let report;198        beforeChunk(() => {199            report = {200                end: sinon.spy(o => o()),201            };202            stdoutReporter.__set__("report", report);203        });204        chunk(async () => {205            await stdoutReporter.done();206            expect(report.end).to.be.calledOnce;207        });208    });209    test("indent()", () => {210        let indent;211        beforeChunk(() => {212            indent = stdoutReporter.__get__("indent");213        });214        [[0, ""], [1, ""], [2, "  "], [3, "    "]].forEach(([indents, result]) => {215            chunk(`for ${indents} indent(s) it should be '${result}'`, () => {216                stdoutReporter.__set__("indents", indents);217                expect(indent()).to.be.equal(result);218            });219        });220    });221    test("stdout()", () => {222        let console_, report;223        beforeChunk(() => {224            console_ = {225                log: sinon.stub(),226            };227            stdoutReporter.__set__("console", console_);228            report = {229                write: sinon.stub(),230            };231            stdoutReporter.__set__("report", report);232        });233        beforeChunk(() => {234            stdout = stdoutReporter.__get__("stdout");235        });236        chunk(() => {237            stdout("hello", "world");238            expect(report.write).to.be.calledOnce;239            expect(report.write.args[0][0]).to.be.equal("hello world\n");240            expect(console_.log).to.be.calledOnce;241            expect(console_.log.args[0][0]).to.be.equal("hello");242            expect(console_.log.args[0][1]).to.be.equal("world");243        });244    });245    test("epilogue()", () => {246        let epilogue,247            printStatistics,248            printSkippedTests,249            printTestErrors,250            printSessionErrors;251        beforeChunk(() => {252            epilogue = stdoutReporter.__get__("epilogue");253            printStatistics = sinon.stub();254            stdoutReporter.__set__("printStatistics", printStatistics);255            printSkippedTests = sinon.stub();256            stdoutReporter.__set__("printSkippedTests", printSkippedTests);257            printTestErrors = sinon.stub();258            printSessionErrors = sinon.stub();259            stdoutReporter.__set__("utils", {260                printTestErrors, printSessionErrors,261            });262        });263        chunk("prints all test results", () => {264            conf.test = {265                cases: [266                    { status: "passed" },267                    { status: "skipped" },268                    { status: "failed" },269                ],270            };271            epilogue();272            expect(printStatistics).to.be.calledOnce;273            expect(printStatistics.args[0]).to.be.eql([1, 1]);274            expect(printSkippedTests).to.be.calledOnce;275            expect(printSkippedTests.args[0][0]).to.be.eql([{ status: "skipped" }]);276            expect(printTestErrors).to.be.calledOnce;277            expect(printTestErrors.args[0][0]).to.be.eql([{ status: "failed" }]);278            expect(printSessionErrors).to.be.calledOnce;279        });280        chunk("print no results", () => {281            conf.test = {282                cases: [],283            };284            epilogue();285            expect(printStatistics).to.be.calledOnce;286            expect(printStatistics.args[0]).to.be.eql([0, 0]);287            expect(printSkippedTests).to.not.be.called;288            expect(printTestErrors).to.be.calledOnce;289            expect(printSessionErrors).to.be.calledOnce;290        });291    });292    test("printStatistics()", () => {293        let printStatistics;294        beforeChunk(() => {295            printStatistics = stdoutReporter.__get__("printStatistics");296            stdoutReporter.__set__("stdout", stdout);297        });298        chunk("prints full statistics", () => {299            conf.test = {300                cases: [301                    { duration: 60000, chunks: ["my chunk"] },302                    { duration: 30000, chunks: ["my chunk"] },303                ],304            };305            printStatistics(1, 1);306            expect(stdout).to.have.callCount(5);307            expect(stdout.args[0][0]).to.include("1").and.include("passed test");308            expect(stdout.args[1][0]).to.include("1").and.include("failed test");309            expect(stdout.args[2][0]).to.include("2 executed chunks");310            expect(stdout.args[4][0]).to.include("Summary tests time is");311            expect(stdout.args[4][1]).to.include("1m 30s");312        });313        chunk("prints statistics of one chunk", () => {314            conf.test = {315                cases: [316                    { duration: 60000, chunks: ["my chunk"] },317                ],318            };319            printStatistics(0, 2);320            expect(stdout.args[0][0]).to.include("2").and.include("failed tests");321            expect(stdout.args[1][0]).to.include("1 executed chunk");322        });323        chunk("prints nothing", () => {324            conf.test = { cases: [] };325            printStatistics(0, 0);326            expect(stdout).to.not.be.called;327        });328        chunk("prints statistics for multiple passed tests", () => {329            conf.test = {330                cases: [331                    { duration: 1000, chunks: ["my chunk"] },332                    { duration: 1000, chunks: ["my chunk"] },333                ],334            };335            printStatistics(2, 0);336            expect(stdout.args[0][0]).to.include("2").and.include("passed tests");337            expect(stdout.args[3][1]).to.include("2 sec");338        });339    });340    test("printSkippedTests()", () => {341        let printSkippedTests;342        beforeChunk(() => {343            printSkippedTests = stdoutReporter.__get__("printSkippedTests");344            stdoutReporter.__set__("stdout", stdout);345        });346        chunk("prints info with details", () => {347            const skippedTests = [{ name: "my test", rawInfo: ["due to bug"] }];348            printSkippedTests(skippedTests);349            expect(stdout).to.be.calledThrice;350            expect(stdout.args[1][0]).to.include("skipped test");351            expect(stdout.args[2][0]).to.include("my test").and.include("due to bug");352        });353        chunk("prints info without details", () => {354            const skippedTests = [{ name: "my test", rawInfo: [] }, { name: "other test", rawInfo: [] }];355            printSkippedTests(skippedTests);356            expect(stdout).to.have.callCount(4);357            expect(stdout.args[1][0]).to.include("skipped tests");358            expect(stdout.args[2][0]).to.include("my test");...testPlugins.js
Source:testPlugins.js  
...5        plugins.__reset__();6    });7    test(".get()", () => {8        chunk("gets found plugins", () => {9            plugins.__set__("systemPlugins", ["plugin-1", "plugin-2"]);10            plugins.__set__("getNames", () => []);11            plugins.__set__("customPlugins", []);12            expect(plugins.get()).to.be.eql(["plugin-1", "plugin-2"]);13        });14        chunk("loads system plugins if they are not", () => {15            const findPlugins = sinon.stub().returns(["plugin-1", "plugin-2"]),16                getPluginsFromDir = sinon.spy(o => o),17                loadPlugins = sinon.spy(o => o);18            plugins.__set__("findPlugins", findPlugins);19            plugins.__set__("getPluginsFromDir", getPluginsFromDir);20            plugins.__set__("loadPlugins", loadPlugins);21            plugins.__set__("getNames", () => []);22            plugins.__set__("customPlugins", []);23            expect(plugins.get()).to.be.eql(["plugin-1", "plugin-2"]);24        });25        chunk("filters system plugins if they match custom", () => {26            plugins.__set__("systemPlugins", [{ name: "plugin-1" }, { name: "plugin-2" }]);27            plugins.__set__("getNames", () => ["plugin-2"]);28            plugins.__set__("customPlugins", []);29            expect(plugins.get()).to.be.eql([{ name: "plugin-1" }]);30        });31        chunk("concats custom plugins with system", () => {32            plugins.__set__("systemPlugins", ["plugin-1", "plugin-2"]);33            plugins.__set__("getNames", () => []);34            plugins.__set__("customPlugins", ["plugin-3"]);35            expect(plugins.get()).to.be.eql(["plugin-1", "plugin-2", "plugin-3"]);36        });37    });38    test("findPlugins()", () => {39        let findPlugins, conf;40        beforeChunk(() => {41            findPlugins = plugins.__get__("findPlugins");42            conf = { plugins: {}};43            plugins.__set__("CONF", conf);44        });45        chunk("does nothing if default plugins are disabled", () => {46            conf.plugins.disableDefault = true;47            expect(findPlugins(["plugin-1"])).to.be.eql(["plugin-1"]);48        });49        chunk("does nothing if plugin dirs don't exist", () => {50            plugins.__set__("fs", { existsSync: () => false });51            expect(findPlugins(["plugin-1"])).to.be.eql(["plugin-1"]);52        });53        chunk("finds glace plugins", () => {54            plugins.__set__("dirsToSearchPlugins", () => ["/path/to/custom"]);55            plugins.__set__("fs", { existsSync: () => true, readdirSync: () => ["glace-2", "glace-3", "glace-3"] });56            const foundPlugins = findPlugins([57                { name: "glace-1", path: "/path/to/plugin/1" },58                { name: "glace-2", path: "/path/to/plugin/2" },59            ]);60            expect(foundPlugins.map(p => p.name)).to.be.eql(["glace-1", "glace-2", "glace-3"]);61            expect(foundPlugins[1].path).to.be.equal("/path/to/custom/glace-2");62        });63    });64    test("getPluginsFromDir()", () => {65        let getPluginsFromDir, conf;66        beforeChunk(() => {67            getPluginsFromDir = plugins.__get__("getPluginsFromDir");68            conf = { plugins: {}};69            plugins.__set__("CONF", conf);70        });71        chunk("does nothing if no plugins dir", () => {72            conf.plugins.dir = null;73            expect(getPluginsFromDir(["plugin-1"])).to.be.eql(["plugin-1"]);74        });75        chunk("throw error if plugin dir is not a dir", () => {76            conf.plugins.dir = "/path/to/custom";77            plugins.__set__("fs", { existsSync: () => true, statSync: () => { return { isDirectory: () => false }; } });78            expect(() => getPluginsFromDir([])).to.throw("isn't a folder");79        });80        chunk("throw error if plugin dir doesn't exist", () => {81            conf.plugins.dir = "/path/to/custom";82            plugins.__set__("fs", { existsSync: () => false });83            expect(() => getPluginsFromDir([])).to.throw("doesn't exist");84        });85        chunk("gets plugins from custom dir", () => {86            conf.plugins.dir = "/path/to/custom";87            plugins.__set__("fs", {88                existsSync: () => true,89                statSync: () => { return { isDirectory: () => true }; },90                readdirSync: () => ["plugin-2", "plugin-3"],91            });92            const gotPlugins = getPluginsFromDir([93                { name: "plugin-1", path: "/path/to/plugin/1" },94                { name: "plugin-2", path: "/path/to/plugin/2" },95            ]);96            expect(gotPlugins.map(p => p.name)).to.be.eql(["plugin-1", "plugin-2", "plugin-3"]);97            expect(gotPlugins[1].path).to.be.equal("/path/to/custom/plugin-2");98        });99    });100    test("loadPlugins()", () => {101        let loadPlugins, logger;102        beforeChunk(() => {103            loadPlugins = plugins.__get__("loadPlugins");104            logger = { error: sinon.stub() };105            plugins.__set__("LOG", logger);106        });107        chunk("loads plugins", () => {108            plugins.__set__("require", () => Object());109            const loadedPlugins = loadPlugins([{ name: "plugin", path: "/path/to/plugin" }]);110            expect(loadedPlugins).to.have.length(1);111            expect(loadedPlugins[0].module).to.exist;112            expect(() => loadedPlugins[0].name = "glace-plugin").to.throw("read only property");113        });114        chunk("throws error if plugin can't be loaded", () => {115            plugins.__set__("require", () => { throw Error(); });116            const loadedPlugins = loadPlugins([{ name: "plugin", path: "/path/to/plugin" }]);117            expect(loadedPlugins).to.have.length(0);118            expect(logger.error).to.be.calledOnce;119            expect(logger.error.args[0][0]).to.startWith("Can't load plugin");120        });121    });122    test(".getModules()", () => {123        chunk(() => {124            plugins.__set__("get", () => [125                { module: { config: "module-1" }},126                { module: { config: "module-2" }},127                { module: {}},128            ]);129            expect(plugins.getModules("config")).to.be.eql(["module-1", "module-2"]);130        });131    });132    test(".clearCache()", () => {133        chunk(() => {134            plugins.__set__("systemPlugins", ["plugin-1"]);135            expect(plugins.__get__("systemPlugins")).to.be.eql(["plugin-1"]);136            plugins.clearCache();137            expect(plugins.__get__("systemPlugins")).to.be.null;138        });139    });140    test(".register()", () => {141        let require_, logger;142        beforeChunk(() => {143            require_ = sinon.stub();144            require_.resolve = sinon.stub();145            plugins.__set__("require", require_);146            logger = { warn: sinon.stub() };147            plugins.__set__("LOG", logger);148        });149        chunk("does nothing if plugin is registered already", () => {150            plugins.__set__("getNames", () => ["my-plugin"]);151            plugins.register("my-plugin");152            expect(plugins.__get__("customPlugins")).to.have.length(0);153            expect(logger.warn.args[0][0]).to.endWith("is registered already");154        });155        chunk("registers plugin", () => {156            plugins.__set__("getNames", () => []);157            plugins.register("my-plugin");158            const customPlugins = plugins.__get__("customPlugins");159            expect(customPlugins).to.have.length(1);160            expect(customPlugins[0].name).to.be.equal("my-plugin");161            expect(require_.args[0][0]).to.be.equal("my-plugin");162            expect(require_.resolve.args[0][0]).to.be.equal("my-plugin");163        });164    });165    test(".remove()", () => {166        let logger;167        beforeChunk(() => {168            logger = { warn: sinon.stub() };169            plugins.__set__("LOG", logger);170        });171        chunk("does nothing if plugin isn't registered yet", () => {172            plugins.__set__("customPlugins", []);173            plugins.remove("my-plugin");174            expect(plugins.__get__("customPlugins")).to.have.length(0);175            expect(logger.warn.args[0][0]).to.endWith("isn't registered yet");176        });177        chunk("removes plugins from list of registered", () => {178            plugins.__set__("customPlugins", [{ name: "my-plugin" }]);179            plugins.remove("my-plugin");180            expect(plugins.__get__("customPlugins")).to.have.length(0);181        });182    });183    test(".getNames()", () => {184        chunk("get custom plugin names", () => {185            plugins.__set__("customPlugins", [{ name: "plugin-1" }, { name: "plugin-2" }]);186            expect(plugins.getNames({ type: "custom" })).to.be.eql(["plugin-1", "plugin-2"]);187        });188        chunk("get system plugin names", () => {189            plugins.__set__("systemPlugins", [{ name: "plugin-1" }, { name: "plugin-2" }]);190            expect(plugins.getNames({ type: "system" })).to.be.eql(["plugin-1", "plugin-2"]);191        });192        chunk("gets empty list if system plugins are absent", () => {193            plugins.__set__("systemPlugins", null);194            expect(plugins.getNames({ type: "system" })).to.be.eql([]);195        });196        chunk("gets all plugin names", () => {197            plugins.__set__("customPlugins", [{ name: "plugin-1" }]);198            plugins.__set__("systemPlugins", [{ name: "plugin-2" }]);199            expect(plugins.getNames()).to.be.eql(["plugin-1", "plugin-2"]);200        });201        chunk("gets custom plugins names if system plugins are absent", () => {202            plugins.__set__("customPlugins", [{ name: "plugin-1" }, { name: "plugin-2" }]);203            plugins.__set__("systemPlugins", null);204            expect(plugins.getNames()).to.be.eql(["plugin-1", "plugin-2"]);205        });206    });207    test("dirsToSearchPlugins()", () => {208        let dirsToSearchPlugins, require_, u;209        beforeChunk(() => {210            dirsToSearchPlugins = plugins.__get__("dirsToSearchPlugins");211            require_ = {};212            plugins.__set__("require", require_);213            u = { cwd: "/path/to/plugins" };214            plugins.__set__("U", u);215            plugins.__set__("module", { paths: ["/path/to/plugins"]});216        });217        chunk("gets dir to search plugins", () => {218            expect(dirsToSearchPlugins()).to.be.eql(["/path/to/plugins"]);219        });220        chunk("excludes require.main module from search", () => {221            require_.main = { filename: "/path/to/bin/index.js" };222            expect(dirsToSearchPlugins()).to.be.eql(["/path/to/bin", "/path/to/plugins"]);223        });224        chunk("exclude current work directory from search", () => {225            u.cwd = "/path/to/cwd";226            expect(dirsToSearchPlugins()).to.be.eql(["/path/to/cwd", "/path/to/plugins"]);227        });228        chunk("does not inject main dir", () => {229            require_.main = { filename: "/path/to/plugins/index.js" };230            plugins.__set__("module", { paths: ["/path/to/plugins"]});231            expect(dirsToSearchPlugins()).to.be.eql(["/path/to/plugins"]);232        });233    });...base.py
Source:base.py  
...11    def __init__(self, name=None, **kw):12        self.name = name13        for k, v in kw.items():14            setattr(self, k, v)15    def __set__(self, instance, value):16        instance.__dict__[self.name] = value17class Typed(Descriptor):18    """Values must of a particular type"""19    expected_type = type(None)20    allow_none = False21    nested = False22    def __init__(self, *args, **kw):23        super(Typed, self).__init__(*args, **kw)24        self.__doc__ = "Values must be of type {0}".format(self.expected_type)25    def __set__(self, instance, value):26        if not isinstance(value, self.expected_type):27            if (not self.allow_none28                or (self.allow_none and value is not None)):29                raise TypeError('expected ' + str(self.expected_type))30        super(Typed, self).__set__(instance, value)31    def __repr__(self):32        return  self.__doc__33def _convert(expected_type, value):34    """35    Check value is of or can be converted to expected type.36    """37    if not isinstance(value, expected_type):38        try:39            value = expected_type(value)40        except:41            raise TypeError('expected ' + str(expected_type))42    return value43class Convertible(Typed):44    """Values must be convertible to a particular type"""45    def __set__(self, instance, value):46        if ((self.allow_none and value is not None)47            or not self.allow_none):48            value = _convert(self.expected_type, value)49        super(Convertible, self).__set__(instance, value)50class Max(Convertible):51    """Values must be less than a `max` value"""52    expected_type = float53    allow_none = False54    def __init__(self, **kw):55        if 'max' not in kw and not hasattr(self, 'max'):56            raise TypeError('missing max value')57        super(Max, self).__init__(**kw)58    def __set__(self, instance, value):59        if ((self.allow_none and value is not None)60            or not self.allow_none):61            value = _convert(self.expected_type, value)62            if value > self.max:63                raise ValueError('Max value is {0}'.format(self.max))64        super(Max, self).__set__(instance, value)65class Min(Convertible):66    """Values must be greater than a `min` value"""67    expected_type = float68    allow_none = False69    def __init__(self, **kw):70        if 'min' not in kw and not hasattr(self, 'min'):71            raise TypeError('missing min value')72        super(Min, self).__init__(**kw)73    def __set__(self, instance, value):74        if ((self.allow_none and value is not None)75            or not self.allow_none):76            value = _convert(self.expected_type, value)77            if value < self.min:78                raise ValueError('Min value is {0}'.format(self.min))79        super(Min, self).__set__(instance, value)80class MinMax(Min, Max):81    """Values must be greater than `min` value and less than a `max` one"""82    pass83class Set(Descriptor):84    """Value can only be from a set of know values"""85    def __init__(self, name=None, **kw):86        if not 'values' in kw:87            raise TypeError("missing set of values")88        kw['values'] = set(kw['values'])89        super(Set, self).__init__(name, **kw)90        self.__doc__ = "Value must be one of {0}".format(self.values)91    def __set__(self, instance, value):92        if value not in self.values:93            raise ValueError(self.__doc__)94        super(Set, self).__set__(instance, value)95class NoneSet(Set):96    """'none' will be treated as None"""97    def __init__(self, name=None, **kw):98        super(NoneSet, self).__init__(name, **kw)99        self.values.add(None)100    def __set__(self, instance, value):101        if value == 'none':102            value = None103        super(NoneSet, self).__set__(instance, value)104class Integer(Convertible):105    expected_type = int106class Float(Convertible):107    expected_type = float108class Bool(Convertible):109    expected_type = bool110    def __set__(self, instance, value):111        if isinstance(value, str):112            if value in ('false', 'f', '0'):113                value = False114        super(Bool, self).__set__(instance, value)115class String(Typed):116    expected_type = str117class Text(String, Convertible):118    pass119class ASCII(Typed):120    expected_type = bytes121class Tuple(Typed):122    expected_type = tuple123class Length(Descriptor):124    def __init__(self, name=None, **kw):125        if "length" not in kw:126            raise TypeError("value length must be supplied")127        super(Length, self).__init__(**kw)128    def __set__(self, instance, value):129        if len(value) != self.length:130            raise ValueError("Value must be length {0}".format(self.length))131        super(Length, self).__set__(instance, value)132class Default(Typed):133    """134    When called returns an instance of the expected type.135    Additional default values can be passed in to the descriptor136    """137    def __init__(self, name=None, **kw):138        if "defaults" not in kw:139            kw['defaults'] = {}140        super(Default, self).__init__(**kw)141    def __call__(self):142        return self.expected_type()143class Alias(Descriptor):144    """145    Aliases can be used when either the desired attribute name is not allowed146    or confusing in Python (eg. "type") or a more descriptve name is desired147    (eg. "underline" for "u")148    """149    def __init__(self, alias):150        self.alias = alias151    def __set__(self, instance, value):152        setattr(instance, self.alias, value)153    def __get__(self, instance, cls):154        return getattr(instance, self.alias)155class MatchPattern(Descriptor):156    """Values must match a regex pattern """157    allow_none = False158    def __init__(self, name=None, **kw):159        if 'pattern' not in kw and not hasattr(self, 'pattern'):160            raise TypeError('missing pattern value')161        super(MatchPattern, self).__init__(name, **kw)162        self.test_pattern = re.compile(self.pattern, re.VERBOSE)163    def __set__(self, instance, value):164        if value is None and not self.allow_none:165            raise ValueError("Value must not be none")166        if ((self.allow_none and value is not None)167            or not self.allow_none):168            if not self.test_pattern.match(value):169                raise ValueError('Value does not match pattern {0}'.format(self.pattern))170        super(MatchPattern, self).__set__(instance, value)171class DateTime(Typed):172    expected_type = datetime.datetime173    def __set__(self, instance, value):174        if value is not None and isinstance(value, str):175            try:176                value = from_ISO8601(value)177            except ValueError:178                raise ValueError("Value must be ISO datetime format")...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!!
