diff --git a/cypress/e2e/NotFoundView.cy.ts b/cypress/e2e/NotFoundView.cy.ts new file mode 100644 index 0000000000000000000000000000000000000000..9f8515e8250d43784702ed3e645e08976a70b43a --- /dev/null +++ b/cypress/e2e/NotFoundView.cy.ts @@ -0,0 +1,17 @@ +describe('NotFound Test', () => { + beforeEach(() => { + cy.visit('/login'); + cy.get('#emailInput input').type('user@example.com'); + cy.get('#passwordInput input').type('John1'); + cy.get('form').submit(); + cy.wait(1000); + cy.visit('/') + }) + it('redirects user when page is not found, then go home', () => { + cy.visit('/non-existent-page') + cy.get('[data-cy="404-error"]').should('exist') + cy.get('[data-cy="to-home"]').click() + cy.url().should('include', '/') + }) + +}) \ No newline at end of file diff --git a/cypress/e2e/Settings/SettingsAccountView.cy.ts b/cypress/e2e/Settings/SettingsAccountView.cy.ts new file mode 100644 index 0000000000000000000000000000000000000000..424675017e5013a5a45ed89037e2f25728340785 --- /dev/null +++ b/cypress/e2e/Settings/SettingsAccountView.cy.ts @@ -0,0 +1,35 @@ +describe('SettingsAccount Test', () => { + beforeEach(() => { + cy.visit('/login'); + cy.get('#emailInput input').type('user@example.com'); + cy.get('#passwordInput input').type('John1'); + cy.get('form').submit(); + cy.wait(1000); + cy.visit('/settings/account') + cy.wait(1000) + }); + + it('updates email of user', () => { + cy.get('[data-cy="email-input"]').find('[data-cy="bi-input"]') + .should('have.value','user@example.com') + cy.get('[data-cy="email-input"]').find('[data-cy="bi-input"]').clear() + cy.get('[data-cy="email-input"]').find('[data-cy="bi-input"]').type('NewEmailforUser@NewExample.com') + cy.get('[data-cy="change-email-btn"]').click() + cy.wait(1000) + cy.get('[data-cy="change-email-msg-confirm"]').should('include.text', 'Email updated successfully!') + + cy.get('[data-cy="menu"]').get('[data-cy="user"]').click(); + cy.get('[data-testid="logout"]').click(); + + cy.get('#emailInput input').type('NewEmailforUser@NewExample.com'); + cy.get('#passwordInput input').type('John1'); + cy.get('form').submit(); + cy.wait(1000); + cy.visit('/settings/account') + cy.wait(1000) + + cy.get('[data-cy="email-input"]').find('[data-cy="bi-input"]').clear() + cy.get('[data-cy="email-input"]').find('[data-cy="bi-input"]').type('user@example.com') + cy.get('[data-cy="change-email-btn"]').click() + }) +}) \ No newline at end of file diff --git a/cypress/e2e/Settings/SettingsBankView.cy.ts b/cypress/e2e/Settings/SettingsBankView.cy.ts new file mode 100644 index 0000000000000000000000000000000000000000..8bd0d1468aa10b8b002180ff9562660ee927b85a --- /dev/null +++ b/cypress/e2e/Settings/SettingsBankView.cy.ts @@ -0,0 +1,25 @@ +describe('SettingsBank Test', () => { + beforeEach(() => { + cy.visit('/login'); + cy.get('#emailInput input').type('user@example.com'); + cy.get('#passwordInput input').type('John1'); + cy.get('form').submit(); + cy.wait(1000); + cy.visit('/settings/bank') + cy.wait(1000) + }); + + it('updates spendings account of user', () => { + cy.get('[data-cy="spending-account-input"]').find('[data-cy="bi-input"]').clear() + cy.get('[data-cy="spending-account-input"]').find('[data-cy="bi-input"]').type('12073650567'); + cy.get('[data-cy="update-spending-btn"]').click() + }) + + it('updates savings account of user', () => { + cy.get('[data-cy="savings-account-input"]').find('[data-cy="bi-input"]').clear() + cy.get('[data-cy="savings-account-input"]').find('[data-cy="bi-input"]').type('12061174077'); + cy.get('[data-cy="update-savings-btn"]').click() + }) + + +}) \ No newline at end of file diff --git a/cypress/e2e/Settings/SettingsProfileView.cy.ts b/cypress/e2e/Settings/SettingsProfileView.cy.ts new file mode 100644 index 0000000000000000000000000000000000000000..2b6e1fd576e06eddfcf31fb7affddd7b32f9f001 --- /dev/null +++ b/cypress/e2e/Settings/SettingsProfileView.cy.ts @@ -0,0 +1,29 @@ +describe('SettingsProfile Test', () => { + beforeEach(() => { + cy.visit('/login'); + cy.get('#emailInput input').type('user@example.com'); + cy.get('#passwordInput input').type('John1'); + cy.get('form').submit(); + cy.wait(1000); + cy.visit('/settings/profile') + cy.wait(1000) + }); + + it('updates first and last name', () => { + cy.get('[data-cy="first-name"]').find('[data-cy="bi-input"]').should('have.value','User') + cy.get('[data-cy="last-name"]').find('[data-cy="bi-input"]').should( 'have.value','User') + cy.get('[data-cy="first-name"]').find('[data-cy="bi-input"]').clear() + cy.get('[data-cy="first-name"]').find('[data-cy="bi-input"]').type('NewFirstName') + cy.get('[data-cy="last-name"]').find('[data-cy="bi-input"]').clear() + cy.get('[data-cy="last-name"]').find('[data-cy="bi-input"]').type('NewLastName') + + cy.get('[data-cy="profile-submit-btn"]').click() + cy.get('[data-cy="menu"]').get('[data-cy="user"]').should('include.text', 'NewFirstName') + //update the user back to its original state + cy.get('[data-cy="first-name"]').find('[data-cy="bi-input"]').clear() + cy.get('[data-cy="first-name"]').find('[data-cy="bi-input"]').type('User') + cy.get('[data-cy="last-name"]').find('[data-cy="bi-input"]').clear() + cy.get('[data-cy="last-name"]').find('[data-cy="bi-input"]').type('User') + cy.get('[data-cy="profile-submit-btn"]').click() + }) +}) \ No newline at end of file diff --git a/cypress/e2e/Settings/SettingsSecurityView.cy.ts b/cypress/e2e/Settings/SettingsSecurityView.cy.ts new file mode 100644 index 0000000000000000000000000000000000000000..8ae2601a479337a887400c31c86cdf121d0cd843 --- /dev/null +++ b/cypress/e2e/Settings/SettingsSecurityView.cy.ts @@ -0,0 +1,46 @@ +describe('SettingsSecurity Test', () => { + beforeEach(() => { + cy.visit('/login'); + cy.get('#emailInput input').type('user@example.com'); + cy.get('#passwordInput input').type('John1'); + cy.get('form').submit(); + cy.wait(1000); + cy.visit('/settings/security') + cy.wait(1000) + }); + + it('updates password of user', () => { + cy.get('[data-cy="old-password-input"]').find('[data-cy="bi-input"]').clear() + cy.get('[data-cy="old-password-input"]').find('[data-cy="bi-input"]').type('John1') + + cy.get('[data-cy="new-password-input"]').find('[data-cy="bi-input"]').clear() + cy.get('[data-cy="new-password-input"]').find('[data-cy="bi-input"]').type('NewJohn1Password') + + cy.get('[data-cy="confirm-password-input"]').find('[data-cy="bi-input"]').clear() + cy.get('[data-cy="confirm-password-input"]').find('[data-cy="bi-input"]').type('NewJohn1Password') + cy.get('[data-cy="update-password-btn"]').click() + + cy.get('[data-cy="menu"]').get('[data-cy="user"]').click(); + cy.get('[data-testid="logout"]').click(); + + // reset all changes made to the user + cy.get('#emailInput input').type('user@example.com'); + cy.get('#passwordInput input').type('NewJohn1Password'); + cy.get('form').submit(); + cy.wait(1000); + cy.visit('/settings/security') + cy.wait(1000) + + cy.get('[data-cy="old-password-input"]').find('[data-cy="bi-input"]').clear() + cy.get('[data-cy="old-password-input"]').find('[data-cy="bi-input"]').type('NewJohn1Password') + + cy.get('[data-cy="new-password-input"]').find('[data-cy="bi-input"]').clear() + cy.get('[data-cy="new-password-input"]').find('[data-cy="bi-input"]').type('John1') + + cy.get('[data-cy="confirm-password-input"]').find('[data-cy="bi-input"]').clear() + cy.get('[data-cy="confirm-password-input"]').find('[data-cy="bi-input"]').type('John1') + cy.get('[data-cy="update-password-btn"]').click() + + + }) +}) \ No newline at end of file diff --git a/cypress/e2e/User/UserFriendsView.cy.ts b/cypress/e2e/User/UserFriendsView.cy.ts new file mode 100644 index 0000000000000000000000000000000000000000..2e8eec5dbc0068f7d0ab1388a55ebcb6ea537406 --- /dev/null +++ b/cypress/e2e/User/UserFriendsView.cy.ts @@ -0,0 +1,44 @@ +describe('Friend Management View', () => { + beforeEach(() => { + cy.visit('/login'); + cy.get('#emailInput input').type('user@example.com'); + cy.get('#passwordInput input').type('John1'); + cy.get('form').submit(); + cy.wait(1000); + cy.visit('/friends') + }); + + it('should display friend management UI elements', () => { + cy.contains('Dine venner') + cy.get('.container').within(() => { + cy.contains('+ Legg til venn') + }) + }) + + it('should navigate between friend management sections', () => { + cy.wait(1000); + cy.get('[data-cy="navigateToFriend"]').first().click(); + cy.wait(1000); + cy.url().should('include', '/profile'); + + }) + + it('should search and add friends', () => { + cy.contains('+ Legg til venn').click() + cy.get('.modal-title').should('contain', 'Legg til venn') + cy.get('input[type="search"]').type('TestUser1') + cy.contains('Søk').click() + cy.wait(1000); + cy.get('.people-nearby').within(() => { + cy.contains('TestUser1') + }) + }) + + it('should display no friend requests when there is no friend requests', () => { + cy.contains('Venneforespørsler').click() + cy.get('.container').within(() => { + cy.contains('Ingen venneforespørsler') + }) + }) + }) + \ No newline at end of file diff --git a/cypress/e2e/User/UserProfileView.cy.ts b/cypress/e2e/User/UserProfileView.cy.ts new file mode 100644 index 0000000000000000000000000000000000000000..f29ecab62af4df5ec5d07924f99751c65df63e9e --- /dev/null +++ b/cypress/e2e/User/UserProfileView.cy.ts @@ -0,0 +1,23 @@ +describe('User Profile Page', () => { + beforeEach(() => { + cy.visit('/login'); + cy.get('#emailInput input').type('user@example.com'); + cy.get('#passwordInput input').type('John1'); + cy.get('form').submit(); + cy.wait(1000); + cy.visit('/profile') + }); + + it('displays user information', () => { + cy.get('[data-cy="firstname"]').should('contain.text', 'MrSlave'); + cy.get('[data-cy="firstname"]').should('contain.text', 'Swift'); + cy.get('[data-cy="points"]').should('contain.text', '253'); + cy.get('[data-cy="streak"]').should('contain.text', '1026'); + }); + + it('navigates to update user settings', () => { + cy.get('[data-cy="toUpdate"]').click(); + cy.url().should('include', '/settings/profile'); + }); + }); + \ No newline at end of file diff --git a/cypress/e2e/example.cy.ts b/cypress/e2e/example.cy.ts deleted file mode 100644 index 7554c35d8d0ff1412457a5ae7f8649a9871cc21b..0000000000000000000000000000000000000000 --- a/cypress/e2e/example.cy.ts +++ /dev/null @@ -1,8 +0,0 @@ -// https://on.cypress.io/api - -describe('My First Test', () => { - it('visits the app root url', () => { - cy.visit('/') - cy.contains('h1', 'You did it!') - }) -}) diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json deleted file mode 100644 index 02e4254378e9785f013be7cc8d94a8229dcbcbb7..0000000000000000000000000000000000000000 --- a/cypress/fixtures/example.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "Using fixtures to represent data", - "email": "hello@cypress.io", - "body": "Fixtures are a great way to mock data for responses to routes" -} diff --git a/src/components/InputFields/BaseInput.vue b/src/components/InputFields/BaseInput.vue index 0fcb767de5107eb4d2c50f4d985ab87aee320d25..df3de5e9d9da2ac3780aaea0fabf5a595352b3ec 100644 --- a/src/components/InputFields/BaseInput.vue +++ b/src/components/InputFields/BaseInput.vue @@ -53,7 +53,7 @@ const onInputEvent = (event: any) => { <template> <div> - <label :for="inputId">{{ label }}</label> + <label :for="inputId" data-cy="bi-label">{{ label }}</label> <input :value="modelValue" @input="onInputEvent" :type="type" @@ -63,9 +63,10 @@ const onInputEvent = (event: any) => { :min="min" :pattern="pattern" :required="required" + data-cy="bi-input" /> - <div class="valid-feedback">{{ validMessage }}</div> - <div class="invalid-feedback" id="invalid">{{ invalidMessage }}</div> + <div data-cy="bi-valid-msg" class="valid-feedback">{{ validMessage }}</div> + <div data-cy="bi-invalid-msg" class="invalid-feedback" id="invalid">{{ invalidMessage }}</div> </div> </template> diff --git a/src/components/UserProfile/UserProfileLayout.vue b/src/components/UserProfile/UserProfileLayout.vue index f2fc2eb4aa70aea14084e2dde1ecc33aaa2d74c3..010e1db278968c23fbc71c7b3917f153a2a57a2a 100644 --- a/src/components/UserProfile/UserProfileLayout.vue +++ b/src/components/UserProfile/UserProfileLayout.vue @@ -66,25 +66,27 @@ const toUpdateUserSettings = () => { <div class="card"> <div class="rounded-top text-white d-flex flex-row bg-primary" style="height:200px;"> <div class="ms-4 mt-5 d-flex flex-column" style="width: 150px;"> + <img :src="imageUrl" alt="Generisk plassholderbilde" class="img-fluid img-thumbnail mt-4 mb-2" style="width: 150px; z-index: 1"> - <button type="button" data-mdb-button-init data-mdb-ripple-init class="btn btn-outline-primary" + <button data-cy="toUpdate" type="button" data-mdb-button-init data-mdb-ripple-init class="btn btn-outline-primary" data-mdb-ripple-color="dark" style="z-index: 1;" id="toUpdate" @click="toUpdateUserSettings"> Rediger profil </button> </div> <div class="ms-3" style="margin-top: 130px;"> - <h1>{{ firstname }} {{ lastname }}</h1> + <h1 data-cy="firstname">{{ firstname }} {{ lastname }}</h1> </div> </div> <div class="p-4 text-black" style="background-color: #f8f9fa;"> <div class="d-flex justify-content-end text-center py-1"> <div> - <p class="mb-1 h2">253 <img src="@/assets/items/pigcoin.png" style="width: 4rem"></p> + + <p class="mb-1 h2" data-cy="points">253 <img src="@/assets/items/pigcoin.png" style="width: 4rem"></p> <p class="small text-muted mb-0">Poeng</p> </div> <div class="px-3"> - <p class="mb-1 h2">1026 <img src="@/assets/icons/fire.png" style="width: 4rem"></p> + <p class="mb-1 h2" data-cy="streak">1026 <img src="@/assets/icons/fire.png" style="width: 4rem"></p> <p class="small text-muted mb-0">Streak</p> </div> </div> diff --git a/src/views/NotFoundView.vue b/src/views/NotFoundView.vue index abe797a09a88baf1be90e93bd505c906c8cf9b55..1d5ecd34e6978554b63f06cfadfad0a391d41f9a 100644 --- a/src/views/NotFoundView.vue +++ b/src/views/NotFoundView.vue @@ -5,13 +5,13 @@ <div class="error-template text-center"> <h1> Oi!</h1> - <h2> + <h2 data-cy="404-error"> 404 Ikke funnet</h2> <div class="error-details"> Beklager, det har oppstått en feil. Forespurt side ikke funnet! </div> <div class="error-actions"> - <Button1 button-text="Ta meg hjem" @click="home" /> + <Button1 data-cy="to-home" button-text="Ta meg hjem" @click="home" /> </div> </div> </div> diff --git a/src/views/Settings/SettingsAccountView.vue b/src/views/Settings/SettingsAccountView.vue index 50c2bfe464d5d4be9269cbb63fb9a452cd825b00..51b570cb6735dead3bff0f9e57ae0efd73906895 100644 --- a/src/views/Settings/SettingsAccountView.vue +++ b/src/views/Settings/SettingsAccountView.vue @@ -55,14 +55,16 @@ onMounted(() => { <hr> <form @submit.prevent="handleSubmit"> <div class="form-group"> - <BaseInput :model-value="emailRef" @input-change-event="handleEmailInputEvent" id="emailInput-change" + <BaseInput data-cy="email-input" :model-value="emailRef" + @input-change-event="handleEmailInputEvent" id="emailInput-change" input-id="email-new" type="email" label="E-post" placeholder="Skriv inn din e-post" invalid-message="Ugyldig e-post"/> </div> - <p class="text-danger">{{ errorMsg }}</p> - <p class="text-success">{{ confirmationMsg }}</p> + <p data-cy="change-email-msg-error" class="text-danger">{{ errorMsg }}</p> + <p data-cy="change-email-msg-confirm" class="text-success">{{ confirmationMsg }}</p> <br> - <button type="submit" class="btn btn-primary">Endre Informasjon</button> + <button data-cy="change-email-btn" type="submit" class="btn btn-primary">Endre + Informasjon</button> <hr> <div class="form-group"> <label class="d-block text-danger">Slett Bruker</label> diff --git a/src/views/Settings/SettingsBankView.vue b/src/views/Settings/SettingsBankView.vue index dc17e8a398e2a1b43d0387533350e97f3c730481..2e06887cf01332788c77cf5993da92582aa74689 100644 --- a/src/views/Settings/SettingsBankView.vue +++ b/src/views/Settings/SettingsBankView.vue @@ -4,22 +4,26 @@ <hr> <form @submit.prevent="handleSpendingSubmit"> <div class="form-group"> - <BaseInput :model-value="spendingAccount" @input-change-event="handleSpendingInputEvent" id="firstNameInputChange" input-id="first-name-new" + <BaseInput data-cy="spending-account-input" :model-value="spendingAccount" + @input-change-event="handleSpendingInputEvent" id="firstNameInputChange" input-id="first-name-new" type="Number" label="Brukskonto" placeholder="Skriv inn din brukskonto" invalid-message="Vennligst skriv inn din brukskonto" /> </div> <br> - <button type="submit" class="btn btn-primary">Oppdater brukskonto</button> + <button data-cy="update-spending-btn" type="submit" class="btn btn-primary">Oppdater + brukskonto</button> </form> <br> <form @submit.prevent="handleSavingSubmit"> <div class="form-group"> - <BaseInput :model-value="savingsAccount" @input-change-event="handleSavingInputEvent" id="firstNameInputChange" input-id="first-name-new" type="Number" + <BaseInput data-cy="savings-account-input" :model-value="savingsAccount" + @input-change-event="handleSavingInputEvent" id="firstNameInputChange" input-id="first-name-new" type="Number" label="Sparekonto" placeholder="Skriv inn din sparekonto" invalid-message="Vennligst skriv inn din sparekonto" /> </div> <br> - <button type="submit" class="btn btn-primary">Oppdater sparekonto</button> + <button data-cy="update-savings-btn" type="submit" class="btn btn-primary">Oppdater + sparekonto</button> </form> <hr> <div class="form-group mb-0"> diff --git a/src/views/Settings/SettingsProfileView.vue b/src/views/Settings/SettingsProfileView.vue index 4b5fb7e8e30f664f2e2751723d094d92cedfe7ac..21377e099ff64fb2de1f10c6f74977db4e525cde 100644 --- a/src/views/Settings/SettingsProfileView.vue +++ b/src/views/Settings/SettingsProfileView.vue @@ -114,18 +114,23 @@ onMounted(() => { </div> </div> <div class="form-group"> - <BaseInput :model-value="firstNameRef" @input-change-event="handleFirstNameInputEvent" id="firstNameInputChange" - input-id="first-name-new" type="text" label="Fornavn" placeholder="Skriv inn ditt fornavn" - invalid-message="Vennligst skriv inn ditt fornavn" /> + <BaseInput data-cy="first-name" :model-value="firstNameRef" + @input-change-event="handleFirstNameInputEvent" id="firstNameInputChange" + input-id="first-name-new" type="text" label="Fornavn" placeholder="Skriv inn ditt fornavn" + invalid-message="Vennligst skriv inn ditt fornavn" /> </div> <br> <div class="form-group"> - <BaseInput :model-value="surnameRef" @input-change-event="handleSurnameInputEvent" id="surnameInput-change" - input-id="surname-new" type="text" label="Etternavn" placeholder="Skriv inn ditt etternavn" - invalid-message="Vennligst skriv inn ditt etternavn" /> + <BaseInput data-cy="last-name" :model-value="surnameRef" + @input-change-event="handleSurnameInputEvent" + id="surnameInput-change" + input-id="surname-new" type="text" label="Etternavn" + placeholder="Skriv inn ditt etternavn" + invalid-message="Vennligst skriv inn ditt etternavn" /> </div> <br> - <button type="submit" class="btn btn-primary">Oppdater profil</button> + <button data-cy="profile-submit-btn" type="submit" class="btn btn-primary">Oppdater + profil</button> </form> </div> </template> diff --git a/src/views/Settings/SettingsSecurityView.vue b/src/views/Settings/SettingsSecurityView.vue index 68dc2113a3544063d91d272aa75d7b503ee3e542..f6352b210bbf65f6698cbb04d78cb615120f04e9 100644 --- a/src/views/Settings/SettingsSecurityView.vue +++ b/src/views/Settings/SettingsSecurityView.vue @@ -5,23 +5,28 @@ <form @submit.prevent="handleSubmit" novalidate> <div class="form-group"> <label class="d-block">Endre passord</label> - <BaseInput :model-value="oldPasswordRef" @input-change-event="handleOldPasswordInputEvent" + <BaseInput data-cy="old-password-input" :model-value="oldPasswordRef" + @input-change-event="handleOldPasswordInputEvent" id="passwordInput-change" input-id="password-old" type="password" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{4,16}" label="Gammelt passord" placeholder="Skriv inn passord" invalid-message="Passordet må være mellom 4 og 16 tegn og inneholde en stor bokstav, en liten bokstav og et tall" /> - <BaseInput :model-value="newPasswordRef" @input-change-event="handleNewPasswordInputEvent" + <BaseInput data-cy="new-password-input" :model-value="newPasswordRef" + @input-change-event="handleNewPasswordInputEvent" id="passwordInput-change" input-id="password-new" type="password" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{4,16}" label="Nytt passord" placeholder="Skriv inn passord" invalid-message="Passordet må være mellom 4 og 16 tegn og inneholde en stor bokstav, en liten bokstav og et tall" /> - <BaseInput :model-value="confirmPasswordRef" @input-change-event="handleConfirmPasswordInputEvent" + <BaseInput data-cy="confirm-password-input" :model-value="confirmPasswordRef" + @input-change-event="handleConfirmPasswordInputEvent" id="passwordInput-change" input-id="password-confirm" type="password" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{4,16}" label="Bekreft nytt passord" placeholder="Skriv inn passord" invalid-message="Passordet må være mellom 4 og 16 tegn og inneholde en stor bokstav, en liten bokstav og et tall" /> </div> - <button type="submit" class="btn btn-primary">Oppdater passord</button> - <button type="reset" class="btn btn-light">Tilbakestill endringer</button> + <button data-cy="update-password-btn" type="submit" class="btn btn-primary">Oppdater + passord</button> + <button data-cy="reset-fields-btn" type="reset" class="btn btn-light">Tilbakestill + endringer</button> </form> <hr> </div> diff --git a/src/views/User/UserFriendsView.vue b/src/views/User/UserFriendsView.vue index 93bec23138cb60c4c5d28fc85248bb7a4459824c..25c115a09c939372286102bdb68feccf09957776 100644 --- a/src/views/User/UserFriendsView.vue +++ b/src/views/User/UserFriendsView.vue @@ -21,9 +21,9 @@ <img :src="'../src/assets/userprofile.png'" alt=""> </div> </div> - <h3><a href="#" class="btn stretched-link" id="profileName" - @click="navigateToFriend(friend.id)">{{ - friend.firstName }}</a></h3> + <h3><router-link to="" data-cy="navigateToFriend" href="#" class="btn stretched-link" + id="profileName" @click="navigateToFriend(friend.id)">{{ + friend.firstName }}</router-link></h3> <div class="desc">{{ friend.firstName }} {{ friend.lastName }}</div> <div class="contacts"> <a class="text removeFriend" data-bs-toggle="collapse" @@ -91,11 +91,12 @@ </div> <div class="col-md-7 col-sm-7"> <h5><a href="#" class="profile-link" @click="toUserProfile(user.id)">{{ - user.firstName }}</a> + user.firstName }}</a> </h5> </div> <div class="col-md-3 col-sm-3"> - <button class="btn btn-primary pull-right" @click="addFriend(user.id)">Legg til venn</button> + <button class="btn btn-primary pull-right" @click="addFriend(user.id)">Legg + til venn</button> </div> </div> </div>