/* * Copyright (C) 2015 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "Greeter.h" #include "PromptsModel.h" #include class GreeterPromptsModelTest : public QObject { Q_OBJECT private: class PromptInfo { public: PromptInfo(PromptsModel::PromptType t, const QString &p) : type(t), text(p) {} PromptsModel::PromptType type; QString text; }; void selectUser(const QString &user) { Greeter::instance()->authenticate(user); QCOMPARE(Greeter::instance()->authenticationUser(), user); } void respond(const QString &response, bool authenticated) { Greeter::instance()->respond(response); QCOMPARE(Greeter::instance()->isAuthenticated(), authenticated); } void comparePrompts(const QList &expected) { QTRY_COMPARE(prompts->rowCount(), expected.size()); for (int i = 0; i < prompts->rowCount(); i++) { QCOMPARE(prompts->data(prompts->index(i, 0), PromptsModel::TypeRole).toInt(), (int)expected[i].type); QCOMPARE(prompts->data(prompts->index(i, 0), PromptsModel::TextRole).toString(), expected[i].text); } } private Q_SLOTS: void initTestCase() { prompts = Greeter::instance()->promptsModel(); QVERIFY(prompts); } void init() { QCOMPARE(prompts->rowCount(), 0); } void cleanup() { prompts->clear(); } void testSimpleFailure() { selectUser("has-password"); comparePrompts({{PromptsModel::Secret, ""}}); respond("nope", false); comparePrompts({{PromptsModel::Secret, ""}}); // prompts don't change immediately selectUser("has-password"); comparePrompts({{PromptsModel::Error, "Invalid password, please try again"}, {PromptsModel::Secret, ""}}); } void testSimpleSuccess() { selectUser("has-password"); comparePrompts({{PromptsModel::Secret, ""}}); respond("password", true); comparePrompts({{PromptsModel::Secret, ""}}); // prompts don't change } void testHasPassword() { selectUser("has-password"); comparePrompts({{PromptsModel::Secret, ""}}); } void testDifferentPrompt() { selectUser("different-prompt"); comparePrompts({{PromptsModel::Secret, "Secret word"}}); } void testNoPassword() { selectUser("no-password"); comparePrompts({{PromptsModel::Button, "Log In"}}); } void testAuthError() { selectUser("auth-error"); comparePrompts({{PromptsModel::Error, "Failed to authenticate"}, {PromptsModel::Button, "Retry"}}); } void testTwoFactor() { selectUser("two-factor"); comparePrompts({{PromptsModel::Secret, ""}}); respond("password", false); comparePrompts({{PromptsModel::Question, "otp"}}); } void testTwoPrompts() { selectUser("two-prompts"); comparePrompts({{PromptsModel::Question, "Favorite Color (blue)"}, {PromptsModel::Secret, ""}}); } void testWackyPrompts() { selectUser("wacky-prompts"); comparePrompts({{PromptsModel::Message, "First message"}, {PromptsModel::Question, "Favorite Color (blue)"}, {PromptsModel::Error, "Second message"}, {PromptsModel::Secret, ""}, {PromptsModel::Message, "Last message"}}); } void testHtmlInfoPrompts() { selectUser("html-info-prompt"); comparePrompts({{PromptsModel::Message, "&"}, {PromptsModel::Secret, ""}}); } void testInfoAfterLogin() { selectUser("info-after-login"); comparePrompts({{PromptsModel::Secret, ""}}); respond("password", true); comparePrompts({{PromptsModel::Message, "Congratulations on logging in!"}, {PromptsModel::Button, "Log In"}}); } void testLocked() { selectUser("locked"); comparePrompts({{PromptsModel::Secret, ""}}); respond("nope", false); selectUser("locked"); comparePrompts({{PromptsModel::Error, "Account is locked"}, {PromptsModel::Secret, ""}}); } private: PromptsModel *prompts; }; QTEST_GUILESS_MAIN(GreeterPromptsModelTest) #include "promptsmodel.moc"