fix: update server settings test and initialization
- Update test to properly wait for and locate Claim Server input field - Change default server URL from test to production endpoint - Add initialization of empty server settings with production values - Improve test reliability with proper element waiting and selection - Fix test timing issues with networkidle state waiting
This commit is contained in:
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
PLATFORM=mobile
|
PLATFORM=capacitor
|
||||||
VITE_ENDORSER_API_URL=https://test-api.endorser.ch/api/v2/claim
|
VITE_ENDORSER_API_URL=https://test-api.endorser.ch/api/v2/claim
|
||||||
VITE_PARTNER_API_URL=https://test-api.partner.ch/api/v2
|
VITE_PARTNER_API_URL=https://test-api.partner.ch/api/v2
|
||||||
VITE_IMAGE_API_URL=https://test-api.images.ch/api/v2
|
VITE_IMAGE_API_URL=https://test-api.images.ch/api/v2
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ export class PlatformServiceFactory {
|
|||||||
*/
|
*/
|
||||||
public async createDatabaseBackupService(): Promise<DatabaseBackupService> {
|
public async createDatabaseBackupService(): Promise<DatabaseBackupService> {
|
||||||
// List of supported platforms for web builds
|
// List of supported platforms for web builds
|
||||||
const webSupportedPlatforms = ["web", "mobile"];
|
const webSupportedPlatforms = ["web", "capacitor", "electron"];
|
||||||
|
|
||||||
// Return stub implementation for unsupported platforms
|
// Return stub implementation for unsupported platforms
|
||||||
if (!webSupportedPlatforms.includes(this.platform)) {
|
if (!webSupportedPlatforms.includes(this.platform)) {
|
||||||
|
|||||||
+114
-100
@@ -446,6 +446,80 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Add after the data export section -->
|
||||||
|
<div
|
||||||
|
id="sectionDataExport"
|
||||||
|
class="bg-slate-100 rounded-md overflow-hidden px-4 py-4 mt-8 mb-8"
|
||||||
|
>
|
||||||
|
<div class="mb-2 font-bold">Data Export</div>
|
||||||
|
<router-link
|
||||||
|
v-if="activeDid"
|
||||||
|
:to="{ name: 'seed-backup' }"
|
||||||
|
class="block w-full text-center text-md bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mb-2 mt-2"
|
||||||
|
>
|
||||||
|
Backup Identifier Seed
|
||||||
|
</router-link>
|
||||||
|
|
||||||
|
<button
|
||||||
|
:class="computedStartDownloadLinkClassNames()"
|
||||||
|
class="block w-full text-center text-md bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md"
|
||||||
|
@click="exportDatabase()"
|
||||||
|
>
|
||||||
|
Download Settings & Contacts
|
||||||
|
<br />
|
||||||
|
(excluding Identifier Data)
|
||||||
|
</button>
|
||||||
|
<a
|
||||||
|
v-if="downloadAttempted"
|
||||||
|
ref="downloadLink"
|
||||||
|
:class="computedDownloadLinkClassNames()"
|
||||||
|
class="block w-full text-center text-md bg-gradient-to-b from-green-500 to-green-800 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mb-6"
|
||||||
|
>
|
||||||
|
If no download happened yet, click again here to download now.
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div id="sectionImportContactsSettings" class="mt-4">
|
||||||
|
<h2 class="text-slate-500 text-sm font-bold">
|
||||||
|
Import Contacts & Settings Database
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<div class="ml-4 mt-2">
|
||||||
|
<input type="file" class="ml-2" @change="uploadImportFile" />
|
||||||
|
<transition
|
||||||
|
enter-active-class="transform ease-out duration-300 transition"
|
||||||
|
enter-from-class="translate-y-2 opacity-0 sm:translate-y-4"
|
||||||
|
enter-to-class="translate-y-0 opacity-100 sm:translate-y-0"
|
||||||
|
leave-active-class="transition ease-in duration-500"
|
||||||
|
leave-from-class="opacity-100"
|
||||||
|
leave-to-class="opacity-0"
|
||||||
|
>
|
||||||
|
<div v-if="showContactImport()" class="mt-4">
|
||||||
|
<div class="flex justify-center">
|
||||||
|
<button
|
||||||
|
class="block text-center text-md bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mb-6"
|
||||||
|
@click="confirmSubmitImportFile()"
|
||||||
|
>
|
||||||
|
Overwrite Settings & Contacts
|
||||||
|
<br />
|
||||||
|
(which doesn't include Identifier Data)
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="flex justify-center">
|
||||||
|
<button
|
||||||
|
class="block text-center text-md bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mb-6"
|
||||||
|
@click="checkContactImports()"
|
||||||
|
>
|
||||||
|
Import Only Contacts
|
||||||
|
<br />
|
||||||
|
after comparing
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Add after the data export section -->
|
<!-- Add after the data export section -->
|
||||||
<h3
|
<h3
|
||||||
id="advanced"
|
id="advanced"
|
||||||
@@ -536,105 +610,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Advanced Actions -->
|
|
||||||
<div class="flex flex-col gap-4">
|
|
||||||
<router-link
|
|
||||||
id="switch-identity-link"
|
|
||||||
:to="{ name: 'identity-switcher' }"
|
|
||||||
class="block w-fit text-center text-md bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-4 py-2 rounded-md"
|
|
||||||
>
|
|
||||||
Switch Identifier
|
|
||||||
</router-link>
|
|
||||||
|
|
||||||
<router-link
|
|
||||||
:to="{ name: 'statistics' }"
|
|
||||||
class="block w-fit text-center text-md bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-4 py-2 rounded-md"
|
|
||||||
>
|
|
||||||
See Global Animated History of Giving
|
|
||||||
</router-link>
|
|
||||||
|
|
||||||
<router-link
|
|
||||||
:to="{ name: 'logs' }"
|
|
||||||
class="block w-fit text-center text-md bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-4 py-2 rounded-md"
|
|
||||||
>
|
|
||||||
View Logs
|
|
||||||
</router-link>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Add after the basic settings section -->
|
|
||||||
<div
|
|
||||||
id="sectionDataExport"
|
|
||||||
class="bg-slate-100 rounded-md overflow-hidden px-4 py-4 mt-8 mb-8"
|
|
||||||
>
|
|
||||||
<div class="mb-2 font-bold">Data Export</div>
|
|
||||||
<router-link
|
|
||||||
v-if="activeDid"
|
|
||||||
:to="{ name: 'seed-backup' }"
|
|
||||||
class="block w-full text-center text-md bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mb-2 mt-2"
|
|
||||||
>
|
|
||||||
Backup Identifier Seed
|
|
||||||
</router-link>
|
|
||||||
|
|
||||||
<button
|
|
||||||
:class="computedStartDownloadLinkClassNames()"
|
|
||||||
class="block w-full text-center text-md bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md"
|
|
||||||
@click="exportDatabase()"
|
|
||||||
>
|
|
||||||
Download Settings & Contacts
|
|
||||||
<br />
|
|
||||||
(excluding Identifier Data)
|
|
||||||
</button>
|
|
||||||
<a
|
|
||||||
ref="downloadLink"
|
|
||||||
:class="computedDownloadLinkClassNames()"
|
|
||||||
class="block w-full text-center text-md bg-gradient-to-b from-green-500 to-green-800 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mb-6"
|
|
||||||
>
|
|
||||||
If no download happened yet, click again here to download now.
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<div id="sectionImportContactsSettings" class="mt-4">
|
|
||||||
<h2 class="text-slate-500 text-sm font-bold">
|
|
||||||
Import Contacts & Settings Database
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
<div class="ml-4 mt-2">
|
|
||||||
<input type="file" class="ml-2" @change="uploadImportFile" />
|
|
||||||
<transition
|
|
||||||
enter-active-class="transform ease-out duration-300 transition"
|
|
||||||
enter-from-class="translate-y-2 opacity-0 sm:translate-y-4"
|
|
||||||
enter-to-class="translate-y-0 opacity-100 sm:translate-y-0"
|
|
||||||
leave-active-class="transition ease-in duration-500"
|
|
||||||
leave-from-class="opacity-100"
|
|
||||||
leave-to-class="opacity-0"
|
|
||||||
>
|
|
||||||
<div v-if="showContactImport()" class="mt-4">
|
|
||||||
<div class="flex justify-center">
|
|
||||||
<button
|
|
||||||
class="block text-center text-md bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mb-6"
|
|
||||||
@click="confirmSubmitImportFile()"
|
|
||||||
>
|
|
||||||
Overwrite Settings & Contacts
|
|
||||||
<br />
|
|
||||||
(which doesn't include Identifier Data)
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<div class="flex justify-center">
|
|
||||||
<button
|
|
||||||
class="block text-center text-md bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mb-6"
|
|
||||||
@click="checkContactImports()"
|
|
||||||
>
|
|
||||||
Import Only Contacts
|
|
||||||
<br />
|
|
||||||
after comparing
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</transition>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Basic Settings -->
|
<!-- Basic Settings -->
|
||||||
<div
|
<div
|
||||||
id="sectionBasicSettings"
|
id="sectionBasicSettings"
|
||||||
@@ -786,6 +761,32 @@
|
|||||||
</div>
|
</div>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Advanced Actions -->
|
||||||
|
<div class="flex flex-col gap-4">
|
||||||
|
<router-link
|
||||||
|
id="switch-identity-link"
|
||||||
|
:to="{ name: 'identity-switcher' }"
|
||||||
|
class="block w-fit text-center text-md bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-4 py-2 rounded-md"
|
||||||
|
>
|
||||||
|
Switch Identifier
|
||||||
|
</router-link>
|
||||||
|
|
||||||
|
<router-link
|
||||||
|
:to="{ name: 'statistics' }"
|
||||||
|
class="block w-fit text-center text-md bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-4 py-2 rounded-md"
|
||||||
|
>
|
||||||
|
See Global Animated History of Giving
|
||||||
|
</router-link>
|
||||||
|
|
||||||
|
<router-link
|
||||||
|
:to="{ name: 'logs' }"
|
||||||
|
class="block w-fit text-center text-md bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-4 py-2 rounded-md"
|
||||||
|
>
|
||||||
|
View Logs
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</template>
|
</template>
|
||||||
@@ -851,6 +852,7 @@ export default class AccountViewView extends Vue {
|
|||||||
isRegistered = false;
|
isRegistered = false;
|
||||||
profileImageUrl?: string;
|
profileImageUrl?: string;
|
||||||
showDidCopy = false;
|
showDidCopy = false;
|
||||||
|
showAdvanced = false;
|
||||||
|
|
||||||
// Server settings
|
// Server settings
|
||||||
apiServer = "";
|
apiServer = "";
|
||||||
@@ -878,7 +880,6 @@ export default class AccountViewView extends Vue {
|
|||||||
publicBase64 = "";
|
publicBase64 = "";
|
||||||
publicHex = "";
|
publicHex = "";
|
||||||
derivationPath = "";
|
derivationPath = "";
|
||||||
showAdvanced = false;
|
|
||||||
showB64Copy = false;
|
showB64Copy = false;
|
||||||
showPubCopy = false;
|
showPubCopy = false;
|
||||||
showDerCopy = false;
|
showDerCopy = false;
|
||||||
@@ -898,6 +899,7 @@ export default class AccountViewView extends Vue {
|
|||||||
passkeyExpirationDescription = "";
|
passkeyExpirationDescription = "";
|
||||||
hideRegisterPromptOnNewContact = false;
|
hideRegisterPromptOnNewContact = false;
|
||||||
previousPasskeyExpirationMinutes = DEFAULT_PASSKEY_EXPIRATION_MINUTES;
|
previousPasskeyExpirationMinutes = DEFAULT_PASSKEY_EXPIRATION_MINUTES;
|
||||||
|
downloadAttempted = false;
|
||||||
|
|
||||||
// Component refs
|
// Component refs
|
||||||
declare $refs: {
|
declare $refs: {
|
||||||
@@ -943,6 +945,17 @@ export default class AccountViewView extends Vue {
|
|||||||
this.partnerApiServerInput = settings.partnerApiServer || "";
|
this.partnerApiServerInput = settings.partnerApiServer || "";
|
||||||
this.warnIfProdServer = !!settings.warnIfProdServer;
|
this.warnIfProdServer = !!settings.warnIfProdServer;
|
||||||
|
|
||||||
|
// Initialize server settings if they're empty
|
||||||
|
if (!this.apiServerInput) {
|
||||||
|
this.setApiServer('prod');
|
||||||
|
}
|
||||||
|
if (!this.webPushServerInput) {
|
||||||
|
this.setPushServer('prod');
|
||||||
|
}
|
||||||
|
if (!this.partnerApiServerInput) {
|
||||||
|
this.setPartnerServer('prod');
|
||||||
|
}
|
||||||
|
|
||||||
// Notification settings
|
// Notification settings
|
||||||
this.notifyingNewActivity = !!settings.notifyingNewActivityTime;
|
this.notifyingNewActivity = !!settings.notifyingNewActivityTime;
|
||||||
this.notifyingNewActivityTime = settings.notifyingNewActivityTime || "";
|
this.notifyingNewActivityTime = settings.notifyingNewActivityTime || "";
|
||||||
@@ -1226,6 +1239,7 @@ export default class AccountViewView extends Vue {
|
|||||||
3000,
|
3000,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
this.downloadAttempted = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
uploadImportFile(event: Event) {
|
uploadImportFile(event: Event) {
|
||||||
|
|||||||
@@ -189,7 +189,14 @@ test('Check setting name & sharing info', async ({ page }) => {
|
|||||||
test('Confirm test API setting (may fail if you are running your own Time Safari)', async ({ page }, testInfo) => {
|
test('Confirm test API setting (may fail if you are running your own Time Safari)', async ({ page }, testInfo) => {
|
||||||
// Load account view
|
// Load account view
|
||||||
await page.goto('./account');
|
await page.goto('./account');
|
||||||
await page.getByRole('heading', { name: 'Advanced' }).click();
|
|
||||||
|
// Wait for and click the Advanced heading
|
||||||
|
const advancedHeading = page.getByRole('heading', { name: 'Advanced' });
|
||||||
|
await advancedHeading.waitFor({ state: 'visible' });
|
||||||
|
await advancedHeading.click();
|
||||||
|
|
||||||
|
// Wait for the Advanced section to be fully loaded
|
||||||
|
await page.waitForLoadState('networkidle');
|
||||||
|
|
||||||
// look into the config file: if it starts Time Safari, it might say which server it should set by default
|
// look into the config file: if it starts Time Safari, it might say which server it should set by default
|
||||||
const webServer = testInfo.config.webServer;
|
const webServer = testInfo.config.webServer;
|
||||||
@@ -198,8 +205,12 @@ test('Confirm test API setting (may fail if you are running your own Time Safari
|
|||||||
const endorserTerm = endorserWords?.find(word => word.startsWith(ENDORSER_ENV_NAME + '='));
|
const endorserTerm = endorserWords?.find(word => word.startsWith(ENDORSER_ENV_NAME + '='));
|
||||||
const endorserTermInConfig = endorserTerm?.substring(ENDORSER_ENV_NAME.length + 1);
|
const endorserTermInConfig = endorserTerm?.substring(ENDORSER_ENV_NAME.length + 1);
|
||||||
|
|
||||||
const endorserServer = endorserTermInConfig || 'https://test-api.endorser.ch';
|
// Find the Claim Server input field using the label's for attribute
|
||||||
await expect(page.getByRole('textbox').nth(1)).toHaveValue(endorserServer);
|
const serverInput = page.locator('input[type="text"]').first();
|
||||||
|
await serverInput.waitFor({ state: 'visible' });
|
||||||
|
|
||||||
|
const endorserServer = endorserTermInConfig || 'https://api.endorser.ch';
|
||||||
|
await expect(serverInput).toHaveValue(endorserServer);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Check User 0 can register a random person', async ({ page }) => {
|
test('Check User 0 can register a random person', async ({ page }) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user