Skip to content

Commit 8bf8a20

Browse files
committed
Fix unit tests
1 parent d45bf3d commit 8bf8a20

File tree

7 files changed

+48
-35
lines changed

7 files changed

+48
-35
lines changed

app/test/testmerginapi.cpp

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ TestMerginApi::~TestMerginApi() = default;
4444

4545
void TestMerginApi::initTestCase()
4646
{
47+
// ping API was late and tests were failing because they didn't delete projects on start
48+
QSignalSpy spy( mApi, &MerginApi::pingMerginFinished );
49+
spy.wait( TestUtils::LONG_REPLY );
4750

4851
QString apiRoot, username, password, workspace;
4952
TestUtils::merginGetAuthCredentials( mApi, apiRoot, username, password );
@@ -82,6 +85,11 @@ void TestMerginApi::initTestCase()
8285
mApiExtra = new MerginApi( *mLocalProjectsExtra );
8386

8487
mApiExtra->setApiRoot( mApi->apiRoot() );
88+
89+
// ping API was late and tests were failing because they didn't delete projects on start
90+
QSignalSpy spy2( mApiExtra, &MerginApi::pingMerginFinished );
91+
spy2.wait( TestUtils::LONG_REPLY );
92+
8593
if ( TestUtils::needsToAuthorizeAgain( mApiExtra, username ) )
8694
{
8795
TestUtils::authorizeUser( mApiExtra, username, password );
@@ -331,9 +339,9 @@ void TestMerginApi::testCreateProjectTwice()
331339

332340
const QList<QVariant> arguments = spy2.takeFirst();
333341
QVERIFY( arguments.at( 0 ).metaType().id() == QMetaType::QString );
334-
QVERIFY( arguments.at( 1 ).metaType().id() == QMetaType::QString );
342+
QVERIFY( arguments.at( 1 ).metaType().id() == QMetaType::Int );
335343

336-
QCOMPARE( arguments.at( 1 ).toString(), QStringLiteral( "Mergin API error: createProject" ) );
344+
QCOMPARE( arguments.at( 1 ).toInt(), 409 );
337345

338346
//Clean created project
339347
deleteRemoteProjectNow( mApi, mWorkspaceName, projectName );
@@ -351,8 +359,8 @@ void TestMerginApi::testDeleteNonExistingProject()
351359

352360
const QList<QVariant> arguments = spy.takeFirst();
353361
QVERIFY( arguments.at( 0 ).metaType().id() == QMetaType::QString );
354-
QVERIFY( arguments.at( 1 ).metaType().id() == QMetaType::QString );
355-
QCOMPARE( arguments.at( 1 ).toString(), QStringLiteral( "Mergin API error: deleteProject" ) );
362+
QVERIFY( arguments.at( 1 ).metaType().id() == QMetaType::Int );
363+
QCOMPARE( arguments.at( 1 ).toInt(), 404 );
356364
}
357365

358366
void TestMerginApi::testCreateDeleteProject()
@@ -485,9 +493,6 @@ void TestMerginApi::testUploadProject()
485493

486494
void TestMerginApi::testMultiChunkUploadDownload()
487495
{
488-
// this will try to upload a file that needs to be split into multiple chunks
489-
// and then also download it correctly again in a clean new download
490-
491496
const QString projectName = "testMultiChunkUploadDownload";
492497
const QString projectFullName = CoreUtils::getFullProjectName( mWorkspaceName, projectName );
493498

@@ -524,8 +529,6 @@ void TestMerginApi::testMultiChunkUploadDownload()
524529

525530
void TestMerginApi::testEmptyFileUploadDownload()
526531
{
527-
// test will try to upload a project with empty file
528-
529532
const QString projectName = QStringLiteral( "testEmptyFileUploadDownload" );
530533
const QString projectFullName = CoreUtils::getFullProjectName( mWorkspaceName, projectName );
531534

@@ -618,9 +621,6 @@ void TestMerginApi::testPushAddedFile()
618621

619622
void TestMerginApi::testPushRemovedFile()
620623
{
621-
// download a project, then remove a file locally and upload the project.
622-
// we then check that the file is really removed on the subsequent download.
623-
624624
const QString projectName = "testPushRemovedFile";
625625
const QString projectFullName = CoreUtils::getFullProjectName( mWorkspaceName, projectName );
626626

@@ -1283,7 +1283,7 @@ void TestMerginApi::testDiffUpdateWithRebase()
12831283
QCOMPARE( summary, expectedSummary );
12841284

12851285
// update our local version now
1286-
downloadRemoteProject( mApi, mWorkspaceName, projectName );
1286+
downloadRemoteProject( mApi, projectFullName, projectId );
12871287

12881288
//
12891289
// check the result
@@ -1354,7 +1354,7 @@ void TestMerginApi::testDiffUpdateWithRebaseFailed()
13541354

13551355
// check that projectReloadNeededAfterSync is emitted and has correct argument
13561356
QCOMPARE( spy.count(), 1 );
1357-
QCOMPARE( spy.takeFirst().at( 0 ).toString(), mWorkspaceName + "/" + projectName );
1357+
QCOMPARE( spy.takeFirst().at( 0 ).toString(), projectId );
13581358

13591359
//
13601360
// check the result
@@ -1469,14 +1469,17 @@ void TestMerginApi::testMigrateProject()
14691469

14701470
// migrate project
14711471
QSignalSpy spy( mApi, &MerginApi::projectCreated );
1472+
QSignalSpy spy1( mApi, &MerginApi::projectAttachedToMergin );
14721473
QSignalSpy spy2( mApi, &MerginApi::syncProjectFinished );
14731474

1474-
QString localProjectId = TestUtils::findProjectByName( projectFullName, mApi->mLocalProjects.projects().values() ).id();
1475+
// we pass only project name to search for as the project is local and doesn't have workspace set yet
1476+
QString localProjectId = TestUtils::findProjectByName( projectName, mApi->mLocalProjects.projects().values() ).id();
14751477
mApi->createProject( mWorkspaceName, projectName, localProjectId );
14761478

14771479
QVERIFY( spy.wait( TestUtils::LONG_REPLY ) );
1478-
QCOMPARE( spy.count(), 1 );
1480+
QCOMPARE( spy.count(), 2 );
14791481
QCOMPARE( spy.takeFirst().at( 1 ).toBool(), true );
1482+
QVERIFY( spy1.wait( TestUtils::LONG_REPLY ) );
14801483
QCOMPARE( mApi->transactions().count(), 1 );
14811484
QVERIFY( spy2.wait( TestUtils::LONG_REPLY * 5 ) );
14821485

@@ -1507,16 +1510,18 @@ void TestMerginApi::testMigrateProjectAndSync()
15071510
// step 1
15081511
createLocalProject( projectDir );
15091512
mApi->mLocalProjects.reloadDataDir();
1510-
QString localProjectId = TestUtils::findProjectByName( projectFullName, mApi->mLocalProjects.projects().values() ).id();
1513+
QString localProjectId = TestUtils::findProjectByName( projectName, mApi->mLocalProjects.projects().values() ).id();
15111514
// step 2
15121515
QSignalSpy spy( mApi, &MerginApi::projectCreated );
1516+
QSignalSpy spy1( mApi, &MerginApi::projectAttachedToMergin );
15131517
QSignalSpy spy2( mApi, &MerginApi::syncProjectFinished );
15141518

15151519
mApi->createProject( mWorkspaceName, projectName, localProjectId );
15161520

15171521
QVERIFY( spy.wait( TestUtils::LONG_REPLY ) );
1518-
QCOMPARE( spy.count(), 1 );
1522+
QCOMPARE( spy.count(), 2 );
15191523
QCOMPARE( spy.takeFirst().at( 1 ).toBool(), true );
1524+
QVERIFY( spy1.wait( TestUtils::LONG_REPLY ) );
15201525
QCOMPARE( mApi->transactions().count(), 1 );
15211526
QVERIFY( spy2.wait( TestUtils::LONG_REPLY * 5 ) );
15221527

@@ -1568,17 +1573,19 @@ void TestMerginApi::testMigrateDetachProject()
15681573

15691574
// reload local manager after copying the project
15701575
mApi->mLocalProjects.reloadDataDir();
1571-
QString localProjectId = TestUtils::findProjectByName( projectFullName, mApi->mLocalProjects.projects().values() ).id();
1576+
QString localProjectId = TestUtils::findProjectByName( projectName, mApi->mLocalProjects.projects().values() ).id();
15721577

15731578
// migrate project
15741579
QSignalSpy spy( mApi, &MerginApi::projectCreated );
1580+
QSignalSpy spy1( mApi, &MerginApi::projectAttachedToMergin );
15751581
QSignalSpy spy2( mApi, &MerginApi::syncProjectFinished );
15761582

15771583
mApi->createProject( mWorkspaceName, projectName, localProjectId );
15781584

15791585
QVERIFY( spy.wait( TestUtils::LONG_REPLY ) );
1580-
QCOMPARE( spy.count(), 1 );
1586+
QCOMPARE( spy.count(), 2 );
15811587
QCOMPARE( spy.takeFirst().at( 1 ).toBool(), true );
1588+
QVERIFY( spy1.wait( TestUtils::LONG_REPLY ) );
15821589
QCOMPARE( mApi->transactions().count(), 1 );
15831590
QVERIFY( spy2.wait( TestUtils::LONG_REPLY * 5 ) );
15841591

app/test/testmerginapi.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,8 @@ class TestMerginApi: public QObject
160160
void testUploadProject();
161161

162162
/**
163-
* Test creates new project on server. Tries to upload and download bigger file (multiple chunks).
163+
* Test creates new project on server. Tries to upload a file that needs to be split into multiple chunks
164+
* and then also downloads it correctly again in a clean new download.
164165
*/
165166
void testMultiChunkUploadDownload();
166167

app/test/testmodels.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,16 +304,19 @@ void TestModels::testProjectsModel()
304304
Project p0;
305305
p0.local.projectNamespace = QStringLiteral( "namespace" );
306306
p0.local.projectName = QStringLiteral( "project_B" );
307+
p0.local.projectId = CoreUtils::uuidWithoutBraces( QUuid::createUuid() );
307308
p0.local.projectDir = QStringLiteral( "project_B_dir" );
308309

309310
Project p1;
310311
p1.local.projectNamespace = QStringLiteral( "namespace" );
311312
p1.local.projectName = QStringLiteral( "project_A" );
313+
p1.local.projectId = CoreUtils::uuidWithoutBraces( QUuid::createUuid() );
312314
p1.local.projectDir = QStringLiteral( "project_A_dir" );
313315

314316
Project p2;
315317
p2.local.projectNamespace = QStringLiteral( "namespace" );
316318
p2.local.projectName = QStringLiteral( "project_C" );
319+
p2.local.projectId = CoreUtils::uuidWithoutBraces( QUuid::createUuid() );
317320
p2.local.projectDir = QStringLiteral( "project_C_dir" );
318321

319322
ProjectsModel model;

app/variablesmanager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ void VariablesManager::setProjectVariables()
203203
QgsExpressionContextUtils::setProjectVariable( mCurrentProject, QStringLiteral( "mergin_project_owner" ), metadata.projectNamespace );
204204
QgsExpressionContextUtils::setProjectVariable( mCurrentProject, QStringLiteral( "mm_project_version" ), metadata.version );
205205
QgsExpressionContextUtils::setProjectVariable( mCurrentProject, QStringLiteral( "mm_project_name" ), metadata.name );
206-
QgsExpressionContextUtils::setProjectVariable( mCurrentProject, QStringLiteral( "mm_project_full_name" ), mMerginApi->getFullProjectName( metadata.projectNamespace, metadata.name ) );
206+
QgsExpressionContextUtils::setProjectVariable( mCurrentProject, QStringLiteral( "mm_project_full_name" ), CoreUtils::getFullProjectName( metadata.projectNamespace, metadata.name ) );
207207
QgsExpressionContextUtils::setProjectVariable( mCurrentProject, QStringLiteral( "mm_project_owner" ), metadata.projectNamespace );
208208
}
209209
else

core/localprojectsmanager.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -157,19 +157,17 @@ void LocalProjectsManager::updateLocalVersion( const QString &projectId, const i
157157
{
158158
if ( mProjects.contains( projectId ) )
159159
{
160-
LocalProject project = mProjects.value( projectId );
161-
project.localVersion = version;
162-
emit localProjectDataChanged( project );
160+
mProjects[ projectId ].localVersion = version;
161+
emit localProjectDataChanged( mProjects.value( projectId ) );
163162
}
164163
}
165164

166165
void LocalProjectsManager::updateNamespace( const QString &projectId, const QString &projectNamespace )
167166
{
168167
if ( mProjects.contains( projectId ) )
169168
{
170-
LocalProject project = mProjects.value( projectId );
171-
project.projectNamespace = projectNamespace;
172-
emit localProjectDataChanged( project );
169+
mProjects[ projectId ].projectNamespace = projectNamespace;
170+
emit localProjectDataChanged( mProjects.value( projectId ) );
173171
}
174172
}
175173

core/merginapi.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ MerginApi::MerginApi( LocalProjectsManager &localProjects, QObject *parent )
4848
, mWorkspaceInfo( new MerginWorkspaceInfo )
4949
, mSubscriptionInfo( new MerginSubscriptionInfo )
5050
, mUserAuth( new MerginUserAuth )
51+
, mManager( new QNetworkAccessManager( this ) )
5152
{
5253
// load cached data if there are any
5354
const QSettings cache;
@@ -242,10 +243,11 @@ QString MerginApi::listProjectsByName( const QStringList &projectNames )
242243

243244
QNetworkRequest request = getDefaultRequest( true );
244245
request.setUrl( url );
246+
request.setRawHeader( "Content-type", "application/json" );
245247

246248
QString requestId = CoreUtils::uuidWithoutBraces( QUuid::createUuid() );
247249

248-
const QNetworkReply *reply = mManager->get( request );
250+
const QNetworkReply *reply = mManager->post( request, body.toJson() );
249251
CoreUtils::log( "list projects by name", QStringLiteral( "Requesting: " ) + url.toString() );
250252
connect( reply, &QNetworkReply::finished, this, [this, requestId] {this->listProjectsByNameReplyFinished( requestId );} );
251253

@@ -1137,6 +1139,8 @@ void MerginApi::createProjectFinished()
11371139
// Upload data if createProject has been called for a local project with empty namespace (case of migrating a project)
11381140
if ( mLocalProjects.projects().contains( projectId ) )
11391141
{
1142+
// we shoot this signal for tests
1143+
emit projectCreated( projectId, true );
11401144
// we remove the process saved under the old ID and pushProject will insert new process with new ID
11411145
emit projectCreated( projectId, false );
11421146

@@ -1159,7 +1163,7 @@ void MerginApi::createProjectFinished()
11591163
const QDir projectDir( info.projectDir );
11601164
if ( projectDir.exists() && !projectDir.isEmpty() )
11611165
{
1162-
pushProject( projectFullName, projectId, true );
1166+
pushProject( projectFullName, serverProject.projectId, true );
11631167
}
11641168
}
11651169
else
@@ -1221,9 +1225,10 @@ void MerginApi::deleteProjectFinished( const bool informUser )
12211225
}
12221226
else
12231227
{
1224-
QString serverMsg = extractServerErrorMsg( r->readAll() );
1228+
const QString serverMsg = extractServerErrorMsg( r->readAll() );
1229+
const int serverErrorCode = r->attribute( QNetworkRequest::HttpStatusCodeAttribute ).toInt();
12251230
CoreUtils::log( "delete " + projectId, QStringLiteral( "FAILED - %1. %2" ).arg( r->errorString(), serverMsg ) );
1226-
emit networkErrorOccurred( serverMsg );
1231+
emit networkErrorOccurred( serverMsg, serverErrorCode );
12271232
}
12281233

12291234
r->deleteLater();
@@ -3308,6 +3313,7 @@ MerginProject MerginApi::parseProjectMetadata( const QJsonObject &proj )
33083313

33093314
project.projectName = proj.value( QStringLiteral( "name" ) ).toString();
33103315
project.projectNamespace = proj.value( QStringLiteral( "namespace" ) ).toString();
3316+
project.projectId = proj.value( QStringLiteral( "id" ) ).toString();
33113317

33123318
QString versionStr = proj.value( QStringLiteral( "version" ) ).toString();
33133319
if ( versionStr.isEmpty() )

core/project.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ struct MerginProject
101101

102102
QString projectName;
103103
QString projectNamespace;
104+
QString projectId;
104105

105106
/**
106107
* Returns the project ID or empty string if no ID is known. Then it's necessary to fetch the ID from API.
@@ -126,9 +127,6 @@ struct MerginProject
126127
{
127128
return !( *this == other );
128129
}
129-
130-
private:
131-
QString projectId;
132130
};
133131

134132
/**

0 commit comments

Comments
 (0)