Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feedback #1

Open
wants to merge 60 commits into
base: feedback
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
13a15c7
Setting up GitHub Classroom Feedback
github-classroom[bot] May 4, 2022
ec6991a
Initial project
Gilajoanna May 4, 2022
d3e888f
Plan for first half of day 1
Gilajoanna May 4, 2022
e5a9d69
Install all dep and devDep
Gilajoanna May 4, 2022
dce5a21
Simple react application
Gilajoanna May 4, 2022
603dee5
Prettier & husky
Gilajoanna May 4, 2022
9711e04
Deploy to heroku
Gilajoanna May 4, 2022
46717d5
Add heroku link
Gilajoanna May 4, 2022
168685a
Getting articles from database and error handling with useLoader and …
Gilajoanna May 4, 2022
8aba61b
Login components and routing
Gilajoanna May 4, 2022
ca00d1d
Setup Login with google, only logged-in users can see profile and lis…
Gilajoanna May 4, 2022
ae71cca
Updated readMe
Gilajoanna May 4, 2022
722f6da
addNewArticle inserts article to database and shows it in list
Gilajoanna May 4, 2022
22121da
Testing on client - renders ListArticle pass
Gilajoanna May 4, 2022
1eb1997
Testing on client - renders ListArticle pass + adding verify.yaml for…
Gilajoanna May 4, 2022
892279a
Fix up 1 on first test
Gilajoanna May 4, 2022
9d7fde9
Fix up 2 on first test
Gilajoanna May 4, 2022
8f17d69
Updated snapshots should give me green test
Gilajoanna May 4, 2022
d87865c
test shows list of article and test shows error pass
Gilajoanna May 4, 2022
ccd0c2d
Update snapshot
Gilajoanna May 4, 2022
f529423
writeNewArticle.test.jsx and test show new article form pass
Gilajoanna May 4, 2022
adf494d
updated snapshot
Gilajoanna May 4, 2022
086214d
test post article on submit
Gilajoanna May 4, 2022
cedafc9
articleApi.test.js with test List all articles in database pass
Gilajoanna May 4, 2022
a4d3fe4
adding secrets on github actions
Gilajoanna May 4, 2022
4be406f
fix up in error in verify.yaml
Gilajoanna May 4, 2022
7224986
fix up 2 in error in verify.yaml
Gilajoanna May 4, 2022
71cf427
test post new article pass
Gilajoanna May 4, 2022
b011ab2
Adding collectCoverage in verify.yaml
Gilajoanna May 4, 2022
7017301
fix up in verify.yaml
Gilajoanna May 4, 2022
cb17f70
adding collectCoverageFrom in package.json server + client
Gilajoanna May 4, 2022
c77a842
update readMe
Gilajoanna May 4, 2022
34d8b55
Plan for day 2 + start on implementing holy grail layout
Gilajoanna May 5, 2022
4c42483
Write new article works again
Gilajoanna May 5, 2022
2ad0bfe
aside for non users
Gilajoanna May 5, 2022
94d5ce4
Holy grail layout with grid
Gilajoanna May 5, 2022
a639a18
Fix up holy grail layout
Gilajoanna May 5, 2022
9511950
no access message to non-user
Gilajoanna May 5, 2022
e06a2f6
Extracted not found
Gilajoanna May 5, 2022
f200ad2
Update README.md
Gilajoanna May 5, 2022
da7c571
Github actions badge
Gilajoanna May 5, 2022
9118313
List with article titles is visible in aside for both users and non-u…
Gilajoanna May 5, 2022
6bf619b
Error handling - no profile and warning in console
Gilajoanna May 5, 2022
81dba4e
Error handling - only authorized to articles if logged in
Gilajoanna May 5, 2022
2517053
Delete articles from database w. deleteJSON
Gilajoanna May 5, 2022
3fcdeff
Updated snapshot
Gilajoanna May 5, 2022
58c5ea3
Error handling
Gilajoanna May 5, 2022
497917f
updated snapshot
Gilajoanna May 5, 2022
4a376e3
Refactor
Gilajoanna May 5, 2022
7d155e9
Updated test post article on submit
Gilajoanna May 5, 2022
747bb15
Test on Login.test.jsx
Gilajoanna May 5, 2022
3ecf8d7
update snapshot
Gilajoanna May 5, 2022
9f64603
Refactoring moving components
Gilajoanna May 5, 2022
3b064c7
Refactoring, styling and one more green test
Gilajoanna May 5, 2022
d7f5092
Update README.md
Gilajoanna May 5, 2022
831f156
ReadMe and Userprofile.test
Gilajoanna May 6, 2022
05e4caf
Snapshottests
Gilajoanna May 6, 2022
72ba8f4
Snapshottests
Gilajoanna May 6, 2022
1bd4e57
Update README.md
Gilajoanna May 6, 2022
0270087
Update README.md
Gilajoanna May 6, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions .github/workflows/verify.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
on:
push:
branches:
- main
- master

jobs:
verify:
permissions: write-all
runs-on: ubuntu-latest
timeout-minutes: 2
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- name: install dependencies
run: npm ci
- run: npm test
env:
MONGODB_URL: ${{ secrets.MONGODB_URL }}
- name: Collect Coverage
uses: ArtiomTr/jest-coverage-report-action@v2
with:
working-directory: client
- name: Collect coverage from server
uses: ArtiomTr/jest-coverage-report-action@v2
with:
working-directory: server
env:
MONGODB_URL: ${{ secrets.MONGODB_URL }}
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/.idea/
/node_modules/
/server/node_modules/
/client/node_modules/
/client/.parcel-cache/
/client/dist/
/server/.env
/client/coverage/
/server/coverage/
4 changes: 4 additions & 0 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npm run prettier:check
3 changes: 3 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/client/dist/
/client/coverage/
/server/coverage/
91 changes: 52 additions & 39 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,52 +1,65 @@
# PG6301 eksamen <tittel på løsningen>
# PG6301 eksamen <Express Yourself>

[Heroku](link til heroku)
[Test rapport](link til testrapport)

## Tips
[Heroku](https://pgr6301-exam-gilajoanna.herokuapp.com)
[Test rapport]()
[![.github/workflows/verify.yaml](https://github.com/kristiania-pg6301-2022/pgr6301-exam-Gilajoanna/actions/workflows/verify.yaml/badge.svg)](https://github.com/kristiania-pg6301-2022/pgr6301-exam-Gilajoanna/actions/workflows/verify.yaml)

* Bruk versjoner av alle dependencies som vi brukte på forelesningene. Det skjer hele tiden endringer i JavaScript-land og noen ganger vil siste versjon oppføre seg forskjellig - ikke kast bort verdifull eksamenstid. Du kan kopiere package.json fra innlevering eller en øving
* Spesielt: React 18 kom i løpet av semesteret. Alt vi har vist er på React 17. Kjør på React 17 nå med mindre du har brukt en del tid på versjon 18 den siste måneden. Det er vesentlige problemer!
* Start med å løse det kritiske: Deployment til Heroku
* Ikke bli sittende med ting du ikke får til mens det er enklere ting du kunne ha gjort. Spesielt tester har overraskende mye vrient med seg. Legg det til siden og løs andre ting om du har problemer
* Les de funksjonelle kravene grundig og test at løsningen din oppfyller dem
* Les læringsmålene beskrevet i eksamensteksten grundig og sjekk at løsningen din demonstrere at du behersker disse
## EXPRESS YOURSELF
Min version av oppgaven där registrerade användare kan skriva egna och läsa andras opinions-artiklar!

## OBS!
På grund av slut på minuter så kör inte mina tester längre i Github actions. Jag har lagt ved screenshots av gröna tester och av testdekkning i den zippade filen.

Dette er versjonene vi brukte under forelesningene om som er validert som ok:

```
"jest": "^27.5.1",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-router-dom": "^6.2.2"
```
## Kode brukt från föreläsning
* AppContext är inspirerat av Reference 12 MovieApiContext. Jag tyckte att denna var en god lösning för att spara linjer med kode och ha den globalt och enkelt tillgänglig för alla filer.
* postJSON, fetchJSON, useLoader
* Jag har sammarbetat med ett fåtal andra personer när jag gjorde min mock-examen. Denna har jag använt och modifierat kod ifrån.


## Egenutfylling av funksjonelle krav

* [ ] *legg inn krav fra eksamentekst*
* *beskriv eventuelle mangler eller problemer for delvis uttelling*
* [ ] *legg inn krav fra eksamentekst*
* *beskriv eventuelle mangler eller problemer for delvis uttelling*
* [x] Anonyme brukere skal se nyhetsaker når de kommer til nettsiden. Legg inn noen nyhetssaker for å demonstrere.
*Listan med nyhetstitlar till vänster syns också för brukere som inte är inloggade.*
*Ett problem här är att den listan inte uppdaterar sig med mindre man refresher sidan när man har lagt till ny artikel*

* [x] En bruker som er logget inn kan klikke på en nyhetssak for å se detaljene om nyhetssaken.
*Det var tänkt att listan med artikel-titlar skulle haft en läs-knapp bruker skulle trycka på så visas enskild artikel. Jag fick bara implementerat att om man är inloggad bruker så har man tillgång till detaljerad artikel-lista.*

* [x] Redaksjonelle brukere kan publisere nye nyhetsartikler
*I min lösning så fick jag inte till att hardkode in en admin bruker med särkilda permissions som att skriva, uppdatera och delete. Därför kan alla inloggade lägga till och ta bort artiklar.*

* [x] Brukeren skal forhindres fra å sende inn en nyhetsartikkel som mangler kategori, tittel eller tekst
*Inte löst på bästa sätt då jag inte fick ut en error-melding i en ny div. Nu visas en Alert och bruker får inte lagt till i databasen.*

* Övriga kommentarer
*Grunnet lite ont om tid så är det bara implementerat en enkel grid layout för att uppfylla kravet om Holy Grail Layout.*

## Må-krav til teknisk løsning
* [x] Besvarelsen skal inneholde en README-fil med link til Heroku og test coverage.
* [x] npm start skal starte server og klient. Concurrently og parcel anbefales
* [x] npm test skal kjøre tester. Testene skal ikke feile
* [x] Koden skal ha konsistent formattering. Prettier og Husky anbefales
* [x] Nettsidene skal ha god layout med CSS Grid (Holy Grail layout) og horisontal navigasjonsmeny. Brukeren må kunne navigere overalt uten å bruke "back" eller redigere URL
* [x] Serveren validerer at brukeren er logget inn
* [ ] Innleveringen skal være i form av en ZIP-fil. Maks størrelse på fila er 1MB Artikler skal lagres i MongoDB
* [x] Applikasjonen skal deployes til Heroku
* [x] Testene skal kjøre på Github Actions


## Egenutfylling av tekniske krav

* [ ] Oppsett av package.json, parcel, express, prettier
* *beskriv eventuelle mangler eller problemer for delvis uttelling*
* [ ] React Router
* *beskriv eventuelle mangler eller problemer for delvis uttelling*
* [ ] Express app
* *beskriv eventuelle mangler eller problemer for delvis uttelling*
* [ ] Kommunikasjon mellom frontend (React) og backend (Express)
* *beskriv eventuelle mangler eller problemer for delvis uttelling*
* [ ] Deployment til Heroku
* *beskriv eventuelle mangler eller problemer for delvis uttelling*
* [ ] Bruk av MongoDB
* *beskriv eventuelle mangler eller problemer for delvis uttelling*
* [ ] OpenID Connect
* *beskriv eventuelle mangler eller problemer for delvis uttelling*
* [x] Oppsett av package.json, parcel, express, prettier
* [x] React Router
* [x] Express app
* [x] Kommunikasjon mellom frontend (React) og backend (Express)
* [x] Deployment til Heroku
* [x] Bruk av MongoDB
* *Har inte fått till update av existerande document, men implementerat delete av document.*
* [x] OpenID Connect
* [ ] Web Sockets
* *beskriv eventuelle mangler eller problemer for delvis uttelling*
* [ ] Jest med dokumentert testdekning
* *beskriv eventuelle mangler eller problemer for delvis uttelling*
* *Inte fått implementerat*
* [x] Jest med dokumentert testdekning
* *På grund av slut på minuter så kör inte mina tester längre i Github actions. Jag har lagt ved screenshots av gröna tester och av testdekkning.*

11 changes: 11 additions & 0 deletions client/__tests__/__snapshots__/articles.test.jsx.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`List articles component renders ListArticle 1`] = `"<div>Please wait..</div>"`;

exports[`List articles component renders article card 1`] = `"<div>Please log in to have full access to articles.</div>"`;

exports[`List articles component shows error in article list 1`] = `"<div><h1>An error occurred</h1><div id=\\"error-message\\">Something went wrong. Please try again.</div></div>"`;

exports[`List articles component shows error in aside article list 1`] = `"<div><h1>An error occurred</h1><div id=\\"error-message\\">Something went wrong. Please try again.</div></div>"`;

exports[`List articles component shows list of articles 1`] = `"<div><div><h2>Article</h2><div><strong></strong></div><div>Writer: <i></i></div><div></div><button type=\\"submit\\">Delete Article</button></div></div>"`;
3 changes: 3 additions & 0 deletions client/__tests__/__snapshots__/homePage.test.jsx.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`Home page component renders HomePage 1`] = `"<div>Please log in to have full access to articles.</div>"`;
3 changes: 3 additions & 0 deletions client/__tests__/__snapshots__/login.test.jsx.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`Login renders LoginPage 1`] = `"<div><h2>Login to read articles</h2><div><button>Login with Google</button></div></div>"`;
3 changes: 3 additions & 0 deletions client/__tests__/__snapshots__/nonUser.test.jsx.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`Non user component renders Non user 1`] = `"<article><div>Please wait..</div></article>"`;
3 changes: 3 additions & 0 deletions client/__tests__/__snapshots__/notFound.test.jsx.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`Not found component renders NotFound 1`] = `"<div><h2>Page not found</h2></div>"`;
5 changes: 5 additions & 0 deletions client/__tests__/__snapshots__/userProfile.test.jsx.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`UserProfile component renders UserProfile 1`] = `"<div>Loading..</div>"`;

exports[`UserProfile component shows error in user profile 1`] = `"<div id=\\"error-message\\">Error! ReferenceError: fetch is not defined</div>"`;
5 changes: 5 additions & 0 deletions client/__tests__/__snapshots__/writeNewArticle.test.jsx.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`Write new article renders article form 1`] = `"<div><label></label> <input type=\\"text\\" name=\\"title\\" value=\\"\\"></div>"`;

exports[`Write new article shows article form 1`] = `"<div><form><h1>Write new article</h1><div><label>Title:</label> <input type=\\"text\\" name=\\"title\\" value=\\"\\"></div><div><label>Category:</label> <input type=\\"text\\" name=\\"title\\" value=\\"\\"></div><div><label>Content:</label> <input type=\\"text\\" name=\\"title\\" value=\\"\\"></div><div><label>Author:</label> <input type=\\"text\\" name=\\"title\\" value=\\"\\"></div><button type=\\"submit\\">Publish</button></form></div>"`;
72 changes: 72 additions & 0 deletions client/__tests__/articles.test.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import * as ReactDOM from "react-dom";
import * as React from "react";
import { AsideArticleList, ListArticles } from "../components/articles.jsx";
import { act } from "react-dom/test-utils";
import { HomePage } from "../components/homePage";

describe("List articles component", () => {
it("renders ListArticle", () => {
const element = document.createElement("div");
ReactDOM.render(<ListArticles />, element);
expect(element.innerHTML).toMatchSnapshot();
});

it("renders article card", () => {
const element = document.createElement("div");
ReactDOM.render(<HomePage />, element);
expect(element.innerHTML).toMatchSnapshot();
});

it("shows list of articles", async () => {
const article = [{ title: "Article" }];
const element = document.createElement("div");
await act(async () => {
ReactDOM.render(
<ListArticles listAllArticles={() => article} />,
element
);
});

expect(
Array.from(element.querySelectorAll("h2")).map((e) => e.innerHTML)
).toEqual(["Article"]);

expect(element.innerHTML).toMatchSnapshot();
});

it("shows error in article list", async () => {
const element = document.createElement("div");
await act(async () => {
ReactDOM.render(
<ListArticles
listAllArticles={() => {
throw new Error("Something went wrong. Please try again.");
}}
/>,
element
);
});
expect(element.querySelector("#error-message").innerHTML).toEqual(
"Something went wrong. Please try again."
);
expect(element.innerHTML).toMatchSnapshot();
});

it("shows error in aside article list", async () => {
const element = document.createElement("div");
await act(async () => {
ReactDOM.render(
<AsideArticleList
listAllArticles={() => {
throw new Error("Something went wrong. Please try again.");
}}
/>,
element
);
});
expect(element.querySelector("#error-message").innerHTML).toEqual(
"Something went wrong. Please try again."
);
expect(element.innerHTML).toMatchSnapshot();
});
});
11 changes: 11 additions & 0 deletions client/__tests__/homePage.test.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import * as ReactDOM from "react-dom";
import * as React from "react";
import { HomePage } from "../components/homePage";

describe("Home page component", () => {
it("renders HomePage", () => {
const element = document.createElement("div");
ReactDOM.render(<HomePage />, element);
expect(element.innerHTML).toMatchSnapshot();
});
});
17 changes: 17 additions & 0 deletions client/__tests__/login.test.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import * as ReactDOM from "react-dom";
import * as React from "react";
import { LoginPage } from "../components/login";
import { MemoryRouter } from "react-router-dom";

describe("Login", () => {
it("renders LoginPage", () => {
const element = document.createElement("div");
ReactDOM.render(
<MemoryRouter>
<LoginPage />
</MemoryRouter>,
element
);
expect(element.innerHTML).toMatchSnapshot();
});
});
11 changes: 11 additions & 0 deletions client/__tests__/nonUser.test.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import * as ReactDOM from "react-dom";
import * as React from "react";
import { NonUser } from "../components/nonUser";

describe("Non user component", () => {
it("renders Non user", () => {
const element = document.createElement("div");
ReactDOM.render(<NonUser />, element);
expect(element.innerHTML).toMatchSnapshot();
});
});
11 changes: 11 additions & 0 deletions client/__tests__/notFound.test.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import * as ReactDOM from "react-dom";
import * as React from "react";
import { NotFound } from "../components/notFound";

describe("Not found component", () => {
it("renders NotFound", () => {
const element = document.createElement("div");
ReactDOM.render(<NotFound />, element);
expect(element.innerHTML).toMatchSnapshot();
});
});
30 changes: 30 additions & 0 deletions client/__tests__/userProfile.test.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import * as ReactDOM from "react-dom";
import * as React from "react";
import { UserProfile } from "../components/userProfile";
import { act } from "react-dom/test-utils";

describe("UserProfile component", () => {
it("renders UserProfile", () => {
const element = document.createElement("div");
ReactDOM.render(<UserProfile />, element);
expect(element.innerHTML).toMatchSnapshot();
});

it("shows error in user profile", async () => {
const element = document.createElement("div");
await act(async () => {
ReactDOM.render(
<UserProfile
user={() => {
throw new Error("Error! ReferenceError: fetch is not defined");
}}
/>,
element
);
});
expect(element.querySelector("#error-message").innerHTML).toEqual(
"Error! ReferenceError: fetch is not defined"
);
expect(element.innerHTML).toMatchSnapshot();
});
});
Loading