File indexing completed on 2024-04-28 04:48:13

0001 /****************************************************************************************
0002  * Copyright (c) 2013 Konrad Zemek <konrad.zemek@gmail.com>                             *
0003  *                                                                                      *
0004  * This program is free software; you can redistribute it and/or modify it under        *
0005  * the terms of the GNU General Public License as published by the Free Software        *
0006  * Foundation; either version 2 of the License, or (at your option) any later           *
0007  * version.                                                                             *
0008  *                                                                                      *
0009  * This program is distributed in the hope that it will be useful, but WITHOUT ANY      *
0010  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A      *
0011  * PARTICULAR PURPOSE. See the GNU General Public License for more details.             *
0012  *                                                                                      *
0013  * You should have received a copy of the GNU General Public License along with         *
0014  * this program.  If not, see <http://www.gnu.org/licenses/>.                           *
0015  ****************************************************************************************/
0016 
0017 #include "TestImporterManager.h"
0018 
0019 #include "core/support/Amarok.h"
0020 #include "core/support/Components.h"
0021 
0022 #include <QStringList>
0023 #include <QTest>
0024 
0025 
0026 QTEST_GUILESS_MAIN( TestImporterManager )
0027 
0028 using namespace ::testing;
0029 
0030 void
0031 TestImporterManager::initShouldLoadSettings()
0032 {
0033     QVariantMap config;
0034     config["uid"] = QString( "TestId" );
0035     config["custom"] = QString( "custom" );
0036 
0037     {
0038         NiceMock<MockManager> mock;
0039 
0040         EXPECT_CALL( mock, newInstance( Eq(config) ) ).WillOnce( Invoke( &mock, &MockManager::concreteNewInstance ) );
0041         EXPECT_CALL( mock, type() ).WillRepeatedly( Return( QString( "TestMockManager" ) ) );
0042 
0043         mock.init();
0044         mock.createProvider( config );
0045     }
0046 
0047     EXPECT_CALL( *m_mockManager, newInstance( Eq(config) ) );
0048     EXPECT_CALL( *m_mockManager, type() ).WillRepeatedly( Return( QString( "TestMockManager" ) ) );
0049 
0050     m_mockManager->init();
0051 }
0052 
0053 void
0054 TestImporterManager::creatingProviderShouldSetConfigAndParent()
0055 {
0056     QVariantMap cfg;
0057     cfg["customField"] = QString( "I'm custom" );
0058 
0059     m_mockManager->init();
0060     StatSyncing::ProviderPtr providerPtr = m_mockManager->createProvider( cfg );
0061 
0062     QVERIFY( dynamic_cast<MockProvider*>(providerPtr.data())->config().contains( "customField" ) );
0063     QCOMPARE( dynamic_cast<MockProvider*>(providerPtr.data())->manager(), m_mockManager );
0064 }
0065 
0066 void
0067 TestImporterManager::creatingProviderShouldSaveSettings()
0068 {
0069     QVariantMap cfg;
0070     cfg["uid"] = QString( "TestId" );
0071     cfg["custom"] = QString( "custom" );
0072 
0073     EXPECT_CALL( *m_mockManager, type() ).WillRepeatedly( Return( QString( "TestMockManager" ) ) );
0074 
0075     m_mockManager->init();
0076     m_mockManager->createProvider( cfg );
0077 
0078     KConfigGroup group = m_mockManager->providerConfig( "TestId" );
0079     QVERIFY( group.exists() );
0080     QCOMPARE( group.readEntry( "uid", QString() ), QString( "TestId" ) );
0081     QCOMPARE( group.readEntry( "custom", QString() ), QString( "custom" ) );
0082 }
0083 
0084 void
0085 TestImporterManager::creatingProviderShouldSaveGeneratedId()
0086 {
0087     EXPECT_CALL( *m_mockManager, type() ).WillRepeatedly( Return( QString( "TestMockManager" ) ) );
0088 
0089     QVERIFY( !m_mockManager->managerConfig().exists() );
0090 
0091     m_mockManager->init();
0092     StatSyncing::ProviderPtr provider = m_mockManager->createProvider( QVariantMap() );
0093 
0094     KConfigGroup group = m_mockManager->managerConfig();
0095     QVERIFY( group.exists() );
0096     QVERIFY( !group.groupList().empty() );
0097 
0098     group = m_mockManager->providerConfig( provider );
0099     QVERIFY( group.exists() );
0100     QCOMPARE( group.readEntry( "uid", QString() ), provider->id() );
0101 }
0102 
0103 void
0104 TestImporterManager::creatingConfigWidgetShouldDelegate()
0105 {
0106     StatSyncing::ProviderConfigWidget *ptr = reinterpret_cast<StatSyncing::ProviderConfigWidget*>( 0x19 );
0107 
0108     EXPECT_CALL( *m_mockManager, configWidget( QVariantMap() ) ).WillOnce( Return( ptr ) );
0109 
0110     m_mockManager->init();
0111     QCOMPARE( m_mockManager->createConfigWidget(), ptr );
0112 }
0113 
0114 void
0115 TestImporterManager::createConfigWidgetShouldNotCrashOnNull()
0116 {
0117     StatSyncing::ProviderConfigWidget *ptr = nullptr;
0118 
0119     EXPECT_CALL( *m_mockManager, configWidget(_) )
0120             .WillOnce( Return( ptr ) );
0121 
0122     m_mockManager->init();
0123     QCOMPARE( m_mockManager->createConfigWidget(), ptr );
0124 }
0125 
0126 void
0127 TestImporterManager::createProviderShouldNotCrashOnNull()
0128 {
0129     m_mockManager->init();
0130 
0131     EXPECT_CALL( *m_mockManager, newInstance(_) )
0132             .WillOnce( Return( QSharedPointer<StatSyncing::ImporterProvider>() ) );
0133 
0134     QVERIFY( !m_mockManager->createProvider( QVariantMap() ) );
0135 }
0136 
0137 void
0138 TestImporterManager::createProviderShouldReplaceProviderIfExists()
0139 {
0140     m_mockManager->init();
0141 
0142     EXPECT_CALL( *m_mockController, registerProvider(_) ).Times( 2 );
0143 
0144     StatSyncing::ProviderPtr provider = m_mockManager->createProvider( QVariantMap() );
0145 
0146     QVERIFY( m_mockManager->providers().contains( provider->id() ) );
0147     QCOMPARE( m_mockManager->providers()[provider->id()], provider );
0148 
0149     EXPECT_CALL( *m_mockController, unregisterProvider( provider ) );
0150 
0151     QVariantMap cfg;
0152     cfg.insert( "uid", provider->id() );
0153     StatSyncing::ProviderPtr replaceProvider = m_mockManager->createProvider( cfg );
0154 
0155     QCOMPARE( m_mockManager->providers()[provider->id()], replaceProvider );
0156 }
0157 
0158 void
0159 TestImporterManager::createProviderShouldRegisterProvider()
0160 {
0161     QVariantMap cfg;
0162     cfg["uid"] = "uid";
0163     StatSyncing::ImporterProviderPtr providerPtr( new NiceMock<MockProvider>( cfg, m_mockManager ) );
0164 
0165     m_mockManager->init();
0166 
0167     EXPECT_CALL( *m_mockManager, newInstance(_) ).WillOnce( Return( providerPtr ) );
0168     EXPECT_CALL( *m_mockController, registerProvider( Eq(providerPtr) ) );
0169 
0170     m_mockManager->createProvider( QVariantMap() );
0171 }
0172 
0173 void
0174 TestImporterManager::forgetProviderShouldUnregisterProvider()
0175 {
0176     m_mockManager->init();
0177 
0178     EXPECT_CALL( *m_mockController, registerProvider(_) );
0179 
0180     StatSyncing::ProviderPtr providerPtr = m_mockManager->createProvider( QVariantMap() );
0181 
0182     EXPECT_CALL( *m_mockController, unregisterProvider( Eq(providerPtr) ) );
0183     m_mockManager->providerForgottenProxy( providerPtr->id() );
0184 }
0185 
0186 void
0187 TestImporterManager::forgetProviderShouldForgetConfig()
0188 {
0189     QVariantMap cfg;
0190     cfg.insert( "uid", "TestId" );
0191 
0192     EXPECT_CALL( *m_mockManager, type() ).WillRepeatedly(
0193                                                  Return( QString( "TestMockManager" ) ) );
0194 
0195     m_mockManager->init();
0196     StatSyncing::ProviderPtr providerPtr = m_mockManager->createProvider( cfg );
0197 
0198     KConfigGroup group = m_mockManager->providerConfig( providerPtr );
0199     QVERIFY( group.exists() );
0200     QVERIFY( group.hasKey( "uid" ) );
0201 
0202     m_mockManager->providerForgottenProxy( providerPtr->id() );
0203 
0204     QVERIFY( !m_mockManager->providerConfig( providerPtr ).exists() );
0205 }
0206 
0207 void
0208 TestImporterManager::forgetProviderShouldHangleInvalidId()
0209 {
0210     EXPECT_CALL( *m_mockController, unregisterProvider(_) ).Times( 0 );
0211 
0212     m_mockManager->init();
0213     m_mockManager->providerForgottenProxy( QString() );
0214 }
0215 
0216 void
0217 TestImporterManager::forgetProviderShouldNotCauseOtherProvidersToBeForgotten()
0218 {
0219     m_mockManager->init();
0220 
0221     StatSyncing::ProviderPtr providerPtr1 = m_mockManager->createProvider( QVariantMap() );
0222     StatSyncing::ProviderPtr providerPtr2 = m_mockManager->createProvider( QVariantMap() );
0223 
0224     QVERIFY( m_mockManager->providerConfig( providerPtr1 ).exists() );
0225     QVERIFY( m_mockManager->providerConfig( providerPtr2 ).exists() );
0226 
0227     m_mockManager->providerForgottenProxy( providerPtr1->id() );
0228 
0229     QVERIFY( !m_mockManager->providerConfig( providerPtr1 ).exists() );
0230     QVERIFY( m_mockManager->providerConfig( providerPtr2 ).exists() );
0231 }
0232 
0233 void
0234 TestImporterManager::managerShouldHandleMultipleProviders()
0235 {
0236     EXPECT_CALL( *m_mockController, registerProvider(_) ).Times( 10 );
0237 
0238     QList<StatSyncing::ProviderPtr> providerPtrs;
0239     for( int i = 0; i < 10; ++i )
0240         providerPtrs << m_mockManager->createProvider( QVariantMap() );
0241 
0242     foreach( const StatSyncing::ProviderPtr &providerPtr, providerPtrs )
0243         QVERIFY( m_mockManager->providers().contains( providerPtr->id() ) );
0244 }
0245