1
0
mirror of https://github.com/altlinux/admc.git synced 2025-02-10 05:57:24 +03:00
admc/tests/admc_test_attributes_tab.cpp
Dmitry Degtyarev 982d9964ba fix tests that use string dialog
qlineedit changed to qplaintextedit
2022-06-09 14:00:39 +04:00

206 lines
7.2 KiB
C++

/*
* ADMC - AD Management Center
*
* Copyright (C) 2020-2022 BaseALT Ltd.
* Copyright (C) 2020-2022 Dmitry Degtyarev
*
* 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, either version 3 of the License, or
* (at your option) any later version.
*
* 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 <http://www.gnu.org/licenses/>.
*/
#include "admc_test_attributes_tab.h"
#include "attribute_dialogs/list_attribute_dialog.h"
#include "attribute_dialogs/string_attribute_dialog.h"
#include "attribute_dialogs/ui_list_attribute_dialog.h"
#include "attribute_dialogs/ui_string_attribute_dialog.h"
#include "tabs/ui_attributes_tab.h"
#include <QDialog>
#include <QPlainTextEdit>
#include <QPushButton>
#include <QSortFilterProxyModel>
#include <QStandardItemModel>
#include <QString>
#include <QTreeView>
#include <QVBoxLayout>
Q_DECLARE_METATYPE(AttributeFilter)
// NOTE: can't be set because order is important. Read only
// has to be set first to enable other filters.
const QList<AttributeFilter> all_filters = {
AttributeFilter_Unset,
AttributeFilter_ReadOnly,
AttributeFilter_Mandatory,
AttributeFilter_Optional,
AttributeFilter_SystemOnly,
AttributeFilter_Constructed,
AttributeFilter_Backlink,
};
void ADMCTestAttributesTab::init() {
ADMCTest::init();
view = new QTreeView(parent_widget);
filter_button = new QPushButton(parent_widget);
edit_button = new QPushButton(parent_widget);
auto view_button = new QPushButton(parent_widget);
edit = new AttributesTabEdit(view, filter_button, edit_button, view_button, parent_widget);
filter_menu = view->findChild<AttributesTabFilterMenu *>();
QVERIFY(filter_menu);
model = edit->findChild<QStandardItemModel *>();
QVERIFY(model);
proxy = edit->findChild<QSortFilterProxyModel *>();
QVERIFY(proxy);
// Create test user
const QString name = TEST_USER;
dn = test_object_dn(name, CLASS_USER);
const bool create_success = ad.object_add(dn, CLASS_USER);
QVERIFY(create_success);
// Load it into the tab
const AdObject object = ad.search_object(dn);
edit->load(ad, object);
// NOTE: filters might be messed up in settings by user
// so reset it before tests
set_filter(all_filters, true);
}
void ADMCTestAttributesTab::cleanup() {
ADMCTest::cleanup();
edit_list.clear();
}
void ADMCTestAttributesTab::load() {
// Check that some attributes loaded correctly
auto check_value = [&](const QString &name, const QString &value) {
const QList<QStandardItem *> item_list = model->findItems(name);
if (item_list.size() != 1) {
return false;
}
QStandardItem *name_item = item_list[0];
QStandardItem *value_item = model->item(name_item->row(), 1);
const QString &this_value = value_item->text();
const bool value_is_correct = (this_value == value);
return value_is_correct;
};
check_value("name", TEST_USER);
check_value("distinguishedName", dn);
}
void ADMCTestAttributesTab::filter_data() {
QTest::addColumn<AttributeFilter>("filter");
QTest::addColumn<QString>("attribute");
QTest::newRow("unset") << AttributeFilter_Unset << ATTRIBUTE_HOME_PHONE;
QTest::newRow("read only") << AttributeFilter_ReadOnly << ATTRIBUTE_OBJECT_GUID;
QTest::newRow("system only") << AttributeFilter_SystemOnly << ATTRIBUTE_WHEN_CREATED;
QTest::newRow("constructed") << AttributeFilter_Constructed << "allowedAttributes";
QTest::newRow("backlink") << AttributeFilter_Backlink << ATTRIBUTE_MEMBER_OF;
QTest::newRow("mandatory") << AttributeFilter_Mandatory << "instanceType";
QTest::newRow("optional") << AttributeFilter_Optional << ATTRIBUTE_COUNTRY_CODE;
// NOTE: read only also needs to affect these read only
// attributes
QTest::newRow("read only allowed") << AttributeFilter_ReadOnly << "allowedAttributes";
QTest::newRow("read only when created") << AttributeFilter_ReadOnly << ATTRIBUTE_WHEN_CREATED;
QTest::newRow("read only member of") << AttributeFilter_ReadOnly << ATTRIBUTE_MEMBER_OF;
}
// Test filters by checking that affected attributes are
// visible/hidden when their filters are checked/unchecked
void ADMCTestAttributesTab::filter() {
QFETCH(AttributeFilter, filter);
QFETCH(QString, attribute);
auto check_filtering = [&](const bool should_be_visible) {
const QList<QStandardItem *> item_list = model->findItems(attribute);
QVERIFY2((item_list.size() == 1), qPrintable(QString("Failed to find attribute %1)").arg(attribute)));
QStandardItem *item = item_list[0];
const QModelIndex index = item->index();
const QModelIndex proxy_index = proxy->mapFromSource(index);
const bool is_visible = proxy_index.isValid();
const bool correct_filtering = (is_visible == should_be_visible);
QVERIFY2(correct_filtering, qPrintable(QString("filter = %1, attribute = %2, is_visible = %3, should_be_visible = %4").arg(filter).arg(attribute).arg(is_visible).arg(should_be_visible)));
};
// Disable(check) all filters (to filter nothing) and
// check that attribute is shown
set_filter(all_filters, true);
check_filtering(true);
// Enable(uncheck) filter and check that attribute is
// hidden
set_filter({filter}, false);
check_filtering(false);
// Reset after test is done
set_filter(all_filters, true);
}
// Change description attribute, apply and then confirm
// changes
void ADMCTestAttributesTab::apply() {
const QString correct_value = "test description";
navigate_until_object(view, "description", Qt::DisplayRole);
edit_button->click();
auto list_attribute_dialog = view->findChild<ListAttributeDialog *>();
QVERIFY(list_attribute_dialog);
QVERIFY(QTest::qWaitForWindowExposed(list_attribute_dialog, 1000));
QPushButton *add_button = list_attribute_dialog->ui->add_button;
add_button->click();
auto string_attribute_dialog = list_attribute_dialog->findChild<StringAttributeDialog *>();
QVERIFY(string_attribute_dialog);
QVERIFY(QTest::qWaitForWindowExposed(string_attribute_dialog, 1000));
QPlainTextEdit *string_attribute_dialog_edit = string_attribute_dialog->ui->edit;
string_attribute_dialog_edit->setPlainText(correct_value);
string_attribute_dialog->accept();
list_attribute_dialog->accept();
edit->apply(ad, dn);
const AdObject object = ad.search_object(dn);
const QString description_value = object.get_string(ATTRIBUTE_DESCRIPTION);
QCOMPARE(description_value, correct_value);
}
void ADMCTestAttributesTab::set_filter(const QList<AttributeFilter> &filter_list, const bool state) {
for (const AttributeFilter &filter : filter_list) {
QAction *action = filter_menu->findChild<QAction *>(QString::number(filter));
QVERIFY(action);
action->setChecked(state);
}
}
QTEST_MAIN(ADMCTestAttributesTab)