From d6106930409f4ad294d0b5487a1e7f42b204967a Mon Sep 17 00:00:00 2001 From: William Pavei Antero Date: Tue, 26 May 2020 19:37:01 -0300 Subject: [PATCH 01/34] fix tests --- angular.json | 4 ++-- src/app/app.component.spec.ts | 24 ++++--------------- .../book/donate/donate.component.spec.ts | 10 ++++++-- .../book/request/request.component.spec.ts | 4 ++-- .../change-password.component.spec.ts | 9 +++++-- .../contact-us/contact-us.component.spec.ts | 10 +++++--- .../cookieconsent.component.spec.ts | 15 ++++++------ .../forgot-password.component.spec.ts | 9 +++++-- 8 files changed, 44 insertions(+), 41 deletions(-) diff --git a/angular.json b/angular.json index ffd98d9b..bc0c2c75 100644 --- a/angular.json +++ b/angular.json @@ -83,7 +83,7 @@ }, "local": { "browserTarget": "angular:build:local" - } + } } }, "extract-i18n": { @@ -100,7 +100,7 @@ "tsConfig": "src/tsconfig.spec.json", "karmaConfig": "src/karma.conf.js", "styles": [ - "src/styles.css" + "src/style.scss" ], "scripts": [], "assets": [ diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 9b33f0c6..40f8d21f 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -1,37 +1,21 @@ import { TestBed, async } from '@angular/core/testing'; -import {RouterTestingModule} from '@angular/router/testing'; +import { RouterTestingModule } from '@angular/router/testing'; import { HttpClient, HttpHandler } from '@angular/common/http'; import { AppConfigModule } from './app-config.module'; import { AppComponent } from './app.component'; import { HeaderComponent } from './components/header/header.component'; -import { AlertComponent } from './core/directives/alert/alert.component'; import { FooterComponent } from './components/footer/footer.component'; import { UserService } from './core/services/user/user.service'; import { AuthenticationService } from './core/services/authentication/authentication.service'; -import { AlertService } from './core/services/alert/alert.service'; describe('AppComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ - AppComponent, - HeaderComponent, - AlertComponent, - FooterComponent - ], - imports: [ - RouterTestingModule, - AppConfigModule - ], - providers: [ - UserService, - AuthenticationService, - - HttpClient, - HttpHandler - ] + declarations: [AppComponent, HeaderComponent, FooterComponent], + imports: [RouterTestingModule, AppConfigModule], + providers: [UserService, AuthenticationService, HttpClient, HttpHandler], }).compileComponents(); })); it('should create the app', async(() => { diff --git a/src/app/components/book/donate/donate.component.spec.ts b/src/app/components/book/donate/donate.component.spec.ts index 8a2a1033..1b5ed2fa 100644 --- a/src/app/components/book/donate/donate.component.spec.ts +++ b/src/app/components/book/donate/donate.component.spec.ts @@ -19,8 +19,14 @@ describe('DonateComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [DonateComponent], - imports: [FormsModule, ReactiveFormsModule, Ng2SmartTableModule, AppConfigModule, RouterTestingModule], - providers: [NgbActiveModal, AlertService] + imports: [ + FormsModule, + ReactiveFormsModule, + Ng2SmartTableModule, + AppConfigModule, + RouterTestingModule, + ], + providers: [NgbActiveModal], }).compileComponents(); })); diff --git a/src/app/components/book/request/request.component.spec.ts b/src/app/components/book/request/request.component.spec.ts index 4bf9ec5a..bd6fa0a3 100644 --- a/src/app/components/book/request/request.component.spec.ts +++ b/src/app/components/book/request/request.component.spec.ts @@ -26,9 +26,9 @@ describe('RequestComponent', () => { NgbModalModule, Ng2SmartTableModule, AppConfigModule, - RouterTestingModule + RouterTestingModule, ], - providers: [NgbActiveModal, HttpClient, HttpHandler, UserService, AlertService] + providers: [NgbActiveModal, HttpClient, HttpHandler, UserService], }).compileComponents(); })); diff --git a/src/app/components/change-password/change-password.component.spec.ts b/src/app/components/change-password/change-password.component.spec.ts index 26e33ac1..68809fa0 100644 --- a/src/app/components/change-password/change-password.component.spec.ts +++ b/src/app/components/change-password/change-password.component.spec.ts @@ -19,8 +19,13 @@ describe('ChangePasswordComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ChangePasswordComponent], - imports: [FormsModule, ReactiveFormsModule, RouterTestingModule, AppConfigModule], - providers: [UserService, HttpClient, HttpHandler, AlertService] + imports: [ + FormsModule, + ReactiveFormsModule, + RouterTestingModule, + AppConfigModule, + ], + providers: [UserService, HttpClient, HttpHandler], }).compileComponents(); })); diff --git a/src/app/components/contact-us/contact-us.component.spec.ts b/src/app/components/contact-us/contact-us.component.spec.ts index 0ffc100f..3a6aa002 100644 --- a/src/app/components/contact-us/contact-us.component.spec.ts +++ b/src/app/components/contact-us/contact-us.component.spec.ts @@ -2,7 +2,11 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { NgxMaskModule } from 'ngx-mask'; import { RecaptchaFormsModule } from 'ng-recaptcha/forms'; -import { RecaptchaModule, RECAPTCHA_SETTINGS, RecaptchaSettings } from 'ng-recaptcha'; +import { + RecaptchaModule, + RECAPTCHA_SETTINGS, + RecaptchaSettings, +} from 'ng-recaptcha'; import { HttpClient, HttpHandler } from '@angular/common/http'; import { RouterTestingModule } from '@angular/router/testing'; @@ -25,9 +29,9 @@ describe('ContactUsComponent', () => { RecaptchaModule.forRoot(), RecaptchaFormsModule, AppConfigModule, - RouterTestingModule + RouterTestingModule, ], - providers: [HttpClient, HttpHandler, AlertService] + providers: [HttpClient, HttpHandler], }).compileComponents(); })); diff --git a/src/app/components/cookieconsent/cookieconsent.component.spec.ts b/src/app/components/cookieconsent/cookieconsent.component.spec.ts index 6613f1a8..4374cf4c 100644 --- a/src/app/components/cookieconsent/cookieconsent.component.spec.ts +++ b/src/app/components/cookieconsent/cookieconsent.component.spec.ts @@ -1,20 +1,19 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { CookieconsentComponent } from './cookieconsent.component'; +import { CookieConsentComponent } from './cookieconsent.component'; -describe('CookieconsentComponent', () => { - let component: CookieconsentComponent; - let fixture: ComponentFixture; +describe('CookieConsentComponent', () => { + let component: CookieConsentComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ CookieconsentComponent ] - }) - .compileComponents(); + declarations: [CookieConsentComponent], + }).compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(CookieconsentComponent); + fixture = TestBed.createComponent(CookieConsentComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/src/app/components/forgot-password/forgot-password.component.spec.ts b/src/app/components/forgot-password/forgot-password.component.spec.ts index dae19293..6039f6f8 100644 --- a/src/app/components/forgot-password/forgot-password.component.spec.ts +++ b/src/app/components/forgot-password/forgot-password.component.spec.ts @@ -19,8 +19,13 @@ describe('ForgotPasswordComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ForgotPasswordComponent], - imports: [FormsModule, ReactiveFormsModule, RouterTestingModule, AppConfigModule], - providers: [UserService, HttpClient, HttpHandler, AlertService] + imports: [ + FormsModule, + ReactiveFormsModule, + RouterTestingModule, + AppConfigModule, + ], + providers: [UserService, HttpClient, HttpHandler], }).compileComponents(); })); From 4e8baaa617e83c75ce6248abf1fb4d01d9571222 Mon Sep 17 00:00:00 2001 From: William Pavei Antero Date: Tue, 26 May 2020 19:37:56 -0300 Subject: [PATCH 02/34] ChromeHeadless to run test inside docker --- src/karma.conf.js | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/karma.conf.js b/src/karma.conf.js index b6e00421..3cbd9b65 100644 --- a/src/karma.conf.js +++ b/src/karma.conf.js @@ -10,22 +10,31 @@ module.exports = function (config) { require('karma-chrome-launcher'), require('karma-jasmine-html-reporter'), require('karma-coverage-istanbul-reporter'), - require('@angular-devkit/build-angular/plugins/karma') + require('@angular-devkit/build-angular/plugins/karma'), ], client: { - clearContext: false // leave Jasmine Spec Runner output visible in browser + clearContext: false, // leave Jasmine Spec Runner output visible in browser }, coverageIstanbulReporter: { dir: require('path').join(__dirname, '../coverage'), reports: ['html', 'lcovonly'], - fixWebpackSourcePaths: true + fixWebpackSourcePaths: true, }, reporters: ['progress', 'kjhtml'], port: 9876, colors: true, logLevel: config.LOG_INFO, autoWatch: true, - browsers: ['Chrome'], - singleRun: false + browsers: ['ChromeHeadlessNoSandbox'], + customLaunchers: { + ChromeHeadlessNoSandbox: { + base: 'ChromeHeadless', + flags: ['--no-sandbox'], + }, + }, + mime: { + 'text/x-typescript': ['ts', 'tsx'], + }, + singleRun: false, }); -}; \ No newline at end of file +}; From 401599045e5f6d07af20627a2b8b39370848e4de Mon Sep 17 00:00:00 2001 From: William Pavei Antero Date: Tue, 26 May 2020 20:47:52 -0300 Subject: [PATCH 03/34] fix code smells --- src/app/components/contact-us/contact-us.component.spec.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/app/components/contact-us/contact-us.component.spec.ts b/src/app/components/contact-us/contact-us.component.spec.ts index 3a6aa002..af087c3f 100644 --- a/src/app/components/contact-us/contact-us.component.spec.ts +++ b/src/app/components/contact-us/contact-us.component.spec.ts @@ -2,18 +2,13 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { NgxMaskModule } from 'ngx-mask'; import { RecaptchaFormsModule } from 'ng-recaptcha/forms'; -import { - RecaptchaModule, - RECAPTCHA_SETTINGS, - RecaptchaSettings, -} from 'ng-recaptcha'; +import { RecaptchaModule } from 'ng-recaptcha'; import { HttpClient, HttpHandler } from '@angular/common/http'; import { RouterTestingModule } from '@angular/router/testing'; import { ContactUsComponent } from './contact-us.component'; import { AppConfigModule } from '../../app-config.module'; -import { ToastrService } from 'ngx-toastr'; describe('ContactUsComponent', () => { let component: ContactUsComponent; From b309dacbafb0925d49827feec81941d85e398ac9 Mon Sep 17 00:00:00 2001 From: William Pavei Antero Date: Fri, 29 May 2020 21:55:05 -0300 Subject: [PATCH 04/34] now tests are running --- angular.json | 10 +++++----- src/karma.conf.js => karma.conf.js | 8 +++----- src/app/app.component.ts | 2 +- src/tsconfig.app.json | 12 ------------ src/tsconfig.spec.json | 19 ------------------- tsconfig.app.json | 18 ++++++++++++++++++ tsconfig.spec.json | 18 ++++++++++++++++++ 7 files changed, 45 insertions(+), 42 deletions(-) rename src/karma.conf.js => karma.conf.js (86%) delete mode 100644 src/tsconfig.app.json delete mode 100644 src/tsconfig.spec.json create mode 100644 tsconfig.app.json create mode 100644 tsconfig.spec.json diff --git a/angular.json b/angular.json index bc0c2c75..de9f0e0d 100644 --- a/angular.json +++ b/angular.json @@ -17,7 +17,7 @@ "index": "src/index.html", "main": "src/main.ts", "polyfills": "src/polyfills.ts", - "tsConfig": "src/tsconfig.app.json", + "tsConfig": "tsconfig.app.json", "assets": [ "src/favicon.ico", "src/assets" @@ -97,8 +97,8 @@ "options": { "main": "src/test.ts", "polyfills": "src/polyfills.ts", - "tsConfig": "src/tsconfig.spec.json", - "karmaConfig": "src/karma.conf.js", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", "styles": [ "src/style.scss" ], @@ -113,8 +113,8 @@ "builder": "@angular-devkit/build-angular:tslint", "options": { "tsConfig": [ - "src/tsconfig.app.json", - "src/tsconfig.spec.json" + "tsconfig.app.json", + "tsconfig.spec.json" ], "exclude": [ "**/node_modules/**" diff --git a/src/karma.conf.js b/karma.conf.js similarity index 86% rename from src/karma.conf.js rename to karma.conf.js index 3cbd9b65..8cc48da6 100644 --- a/src/karma.conf.js +++ b/karma.conf.js @@ -16,8 +16,8 @@ module.exports = function (config) { clearContext: false, // leave Jasmine Spec Runner output visible in browser }, coverageIstanbulReporter: { - dir: require('path').join(__dirname, '../coverage'), - reports: ['html', 'lcovonly'], + dir: require('path').join(__dirname, './coverage/teste'), + reports: ['html', 'lcovonly', 'text-summary'], fixWebpackSourcePaths: true, }, reporters: ['progress', 'kjhtml'], @@ -32,9 +32,7 @@ module.exports = function (config) { flags: ['--no-sandbox'], }, }, - mime: { - 'text/x-typescript': ['ts', 'tsx'], - }, singleRun: false, + restartOnFileChange: true, }); }; diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 5684f000..a82621e9 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -3,7 +3,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html', - styleUrls: ['../style.scss'] + styleUrls: ['./app.component.css'], }) export class AppComponent implements OnInit { ngOnInit() {} diff --git a/src/tsconfig.app.json b/src/tsconfig.app.json deleted file mode 100644 index 722c370d..00000000 --- a/src/tsconfig.app.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/app", - "module": "es2015", - "types": [] - }, - "exclude": [ - "src/test.ts", - "**/*.spec.ts" - ] -} diff --git a/src/tsconfig.spec.json b/src/tsconfig.spec.json deleted file mode 100644 index 8f7cedec..00000000 --- a/src/tsconfig.spec.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/spec", - "module": "commonjs", - "types": [ - "jasmine", - "node" - ] - }, - "files": [ - "test.ts", - "polyfills.ts" - ], - "include": [ - "**/*.spec.ts", - "**/*.d.ts" - ] -} diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 00000000..565a11a2 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,18 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "src/test.ts", + "src/**/*.spec.ts" + ] +} diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 00000000..6400fde7 --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,18 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} From 2b8b4ad46b0c7cb47e754760c6adcb72bf9ecd58 Mon Sep 17 00:00:00 2001 From: William Pavei Antero Date: Fri, 29 May 2020 22:07:59 -0300 Subject: [PATCH 05/34] Running test inside docker --- README.md | 3 +++ docker-compose.yml | 2 +- package.json | 3 +-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 12ed61b7..947ce8dd 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,9 @@ docker-compose up -d --build # Criando imagem e rodando o container com Backend LOCAL docker-compose -f docker-compose-local.yml up -d --build +# Rodando os testes unitários +docker-compose run --rm sharebook npm run test + # Parando o container docker-compose stop diff --git a/docker-compose.yml b/docker-compose.yml index 8ee87f78..97468621 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: - example: + sharebook: container_name: sharebook-frontend-dev build: context: . diff --git a/package.json b/package.json index 72da3a82..eb278fdf 100644 --- a/package.json +++ b/package.json @@ -24,8 +24,7 @@ "build-dev": "ng build", "build-stg": "ng build --configuration=stage", "build-prod": "ng build --configuration=production", - "test": "ng test", - "test-single": "ng test --watch=false --progress", + "test": "ng test --codeCoverage=true --watch=false", "lint": "ng lint", "e2e": "ng e2e", "precommit": "npm run lint", From 09fb52df4739350e4785e10f8490ded70f72ee4c Mon Sep 17 00:00:00 2001 From: William Pavei Antero Date: Sat, 30 May 2020 02:49:45 -0300 Subject: [PATCH 06/34] fix test --- src/app/app.component.spec.ts | 8 ++-- .../account/account.component.spec.ts | 19 +++++--- .../book/details/details.component.spec.ts | 17 ++++--- .../donate-page/donate-page.component.spec.ts | 25 ++++++++-- .../book/donate/donate.component.spec.ts | 8 ++-- .../donations/donations.component.spec.ts | 15 +++++- .../facilitator-notes.component.spec.ts | 22 ++++++--- .../book/form/form.component.spec.ts | 22 +++++---- .../book/list/list.component.spec.ts | 7 +-- .../main-users/main-users.component.spec.ts | 10 ++-- .../book/request/request.component.spec.ts | 8 ++-- .../search-results.component.spec.ts | 14 +++++- .../book/tracking/tracking.component.spec.ts | 14 +++--- .../card-book/card-book.component.spec.ts | 46 ++++++++++++++++--- .../change-password.component.spec.ts | 17 ++++--- .../contact-us/contact-us.component.spec.ts | 6 ++- .../forgot-password.component.spec.ts | 17 ++++--- .../header/header.component.spec.ts | 6 +-- .../components/home/home.component.spec.ts | 12 +++-- .../components/login/login.component.spec.ts | 12 +++-- .../components/panel/panel.component.spec.ts | 9 ++-- .../register/register.component.spec.ts | 16 +++++-- .../reset-password.component.spec.ts | 18 +++++--- .../services/address/address.service.spec.ts | 8 ++-- .../authentication.service.spec.ts | 15 +++--- .../core/services/book/book.service.spec.ts | 6 +-- .../category/category.service.spec.ts | 15 +++--- .../contact-us/contact-us.service.spec.ts | 15 +++--- .../core/services/user/user.service.spec.ts | 6 +-- 29 files changed, 274 insertions(+), 139 deletions(-) diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 40f8d21f..5dfaf740 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -1,6 +1,6 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed, async } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; -import { HttpClient, HttpHandler } from '@angular/common/http'; import { AppConfigModule } from './app-config.module'; import { AppComponent } from './app.component'; @@ -9,13 +9,15 @@ import { FooterComponent } from './components/footer/footer.component'; import { UserService } from './core/services/user/user.service'; import { AuthenticationService } from './core/services/authentication/authentication.service'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; describe('AppComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [AppComponent, HeaderComponent, FooterComponent], - imports: [RouterTestingModule, AppConfigModule], - providers: [UserService, AuthenticationService, HttpClient, HttpHandler], + schemas: [NO_ERRORS_SCHEMA], + imports: [RouterTestingModule, AppConfigModule, HttpClientTestingModule], + providers: [UserService, AuthenticationService], }).compileComponents(); })); it('should create the app', async(() => { diff --git a/src/app/components/account/account.component.spec.ts b/src/app/components/account/account.component.spec.ts index 674fe163..dac0d3ab 100644 --- a/src/app/components/account/account.component.spec.ts +++ b/src/app/components/account/account.component.spec.ts @@ -1,9 +1,7 @@ -/* tslint:disable:no-unused-variable */ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ToastrModule } from 'ngx-toastr'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; -import { DebugElement } from '@angular/core'; import { RouterTestingModule } from '@angular/router/testing'; -import { HttpClient, HttpHandler } from '@angular/common/http'; import { AccountComponent } from './account.component'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; @@ -11,7 +9,6 @@ import { NgxMaskModule } from 'ngx-mask'; import { AppConfigModule } from '../../app-config.module'; import { UserService } from '../../core/services/user/user.service'; -import { ToastrService } from 'ngx-toastr'; import { AddressService } from '../../core/services/address/address.service'; describe('AccountComponent', () => { @@ -21,8 +18,16 @@ describe('AccountComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [AccountComponent], - imports: [FormsModule, ReactiveFormsModule, NgxMaskModule.forRoot(), RouterTestingModule, AppConfigModule], - providers: [UserService, AddressService, HttpClient, HttpHandler] + imports: [ + FormsModule, + ReactiveFormsModule, + NgxMaskModule.forRoot(), + RouterTestingModule, + AppConfigModule, + ToastrModule.forRoot(), + HttpClientTestingModule, + ], + providers: [UserService, AddressService], }).compileComponents(); })); diff --git a/src/app/components/book/details/details.component.spec.ts b/src/app/components/book/details/details.component.spec.ts index e1427120..339eb047 100644 --- a/src/app/components/book/details/details.component.spec.ts +++ b/src/app/components/book/details/details.component.spec.ts @@ -1,9 +1,6 @@ -/* tslint:disable:no-unused-variable */ +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; -import { DebugElement } from '@angular/core'; import { RouterTestingModule } from '@angular/router/testing'; -import { HttpClient, HttpHandler } from '@angular/common/http'; import { NgbModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; import { DetailsComponent } from './details.component'; @@ -11,6 +8,7 @@ import { DetailsComponent } from './details.component'; import { AppConfigModule } from '../../../app-config.module'; import { UserService } from '../../../core/services/user/user.service'; import { AuthenticationService } from '../../../core/services/authentication/authentication.service'; +import { FormsModule } from '@angular/forms'; describe('DetailsComponent', () => { let component: DetailsComponent; @@ -19,8 +17,15 @@ describe('DetailsComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [DetailsComponent], - imports: [RouterTestingModule, AppConfigModule, NgbModule.forRoot(), NgbModalModule], - providers: [UserService, AuthenticationService, HttpClient, HttpHandler] + imports: [ + RouterTestingModule, + AppConfigModule, + NgbModule.forRoot(), + NgbModalModule, + HttpClientTestingModule, + FormsModule, + ], + providers: [UserService, AuthenticationService], }).compileComponents(); })); diff --git a/src/app/components/book/donate-page/donate-page.component.spec.ts b/src/app/components/book/donate-page/donate-page.component.spec.ts index 4242e5c9..d7e2e5c1 100644 --- a/src/app/components/book/donate-page/donate-page.component.spec.ts +++ b/src/app/components/book/donate-page/donate-page.component.spec.ts @@ -1,17 +1,34 @@ -/* tslint:disable:no-unused-variable */ +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { AppConfigModule } from './../../../app-config.module'; +import { AddressService } from './../../../core/services/address/address.service'; +import { RouterTestingModule } from '@angular/router/testing'; +// import { ActivatedRoute } from '@angular/router'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; -import { DebugElement } from '@angular/core'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { DonatePageComponent } from './donate-page.component'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; describe('DonatePageComponent', () => { let component: DonatePageComponent; let fixture: ComponentFixture; + // const fakeActivatedRoute = { + // snapshot: { data: {} }, + // } as ActivatedRoute; + beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [DonatePageComponent] + declarations: [DonatePageComponent], + schemas: [NO_ERRORS_SCHEMA], + imports: [ + FormsModule, + ReactiveFormsModule, + RouterTestingModule, + AppConfigModule, + HttpClientTestingModule, + ], + providers: [AddressService], }).compileComponents(); })); diff --git a/src/app/components/book/donate/donate.component.spec.ts b/src/app/components/book/donate/donate.component.spec.ts index 1b5ed2fa..cf20108d 100644 --- a/src/app/components/book/donate/donate.component.spec.ts +++ b/src/app/components/book/donate/donate.component.spec.ts @@ -1,7 +1,5 @@ -/* tslint:disable:no-unused-variable */ +import { ToastrModule } from 'ngx-toastr'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; -import { DebugElement } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { Ng2SmartTableModule } from 'ng2-smart-table'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; @@ -10,7 +8,7 @@ import { RouterTestingModule } from '@angular/router/testing'; import { DonateComponent } from './donate.component'; import { AppConfigModule } from '../../../app-config.module'; -import { ToastrService } from 'ngx-toastr'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; describe('DonateComponent', () => { let component: DonateComponent; @@ -19,12 +17,14 @@ describe('DonateComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [DonateComponent], + schemas: [NO_ERRORS_SCHEMA], imports: [ FormsModule, ReactiveFormsModule, Ng2SmartTableModule, AppConfigModule, RouterTestingModule, + ToastrModule.forRoot(), ], providers: [NgbActiveModal], }).compileComponents(); diff --git a/src/app/components/book/donations/donations.component.spec.ts b/src/app/components/book/donations/donations.component.spec.ts index f732a7aa..c0a5e871 100644 --- a/src/app/components/book/donations/donations.component.spec.ts +++ b/src/app/components/book/donations/donations.component.spec.ts @@ -1,3 +1,4 @@ +import { ToastrModule } from 'ngx-toastr'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { Ng2SmartTableModule } from 'ng2-smart-table'; import { NgbModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; @@ -5,6 +6,9 @@ import { NgbModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; import { DonationsComponent } from './donations.component'; import { AppConfigModule } from '../../../app-config.module'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ConfirmationDialogService } from 'src/app/core/services/confirmation-dialog/confirmation-dialog.service'; +import { RouterTestingModule } from '@angular/router/testing'; describe('DonationsComponent', () => { let component: DonationsComponent; @@ -13,7 +17,16 @@ describe('DonationsComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [DonationsComponent], - imports: [Ng2SmartTableModule, AppConfigModule, NgbModule.forRoot(), NgbModalModule] + schemas: [NO_ERRORS_SCHEMA], + imports: [ + Ng2SmartTableModule, + AppConfigModule, + NgbModule.forRoot(), + NgbModalModule, + ToastrModule.forRoot(), + RouterTestingModule, + ], + providers: [ConfirmationDialogService], }).compileComponents(); })); diff --git a/src/app/components/book/facilitator-notes/facilitator-notes.component.spec.ts b/src/app/components/book/facilitator-notes/facilitator-notes.component.spec.ts index 77a68a5e..404bb5a2 100644 --- a/src/app/components/book/facilitator-notes/facilitator-notes.component.spec.ts +++ b/src/app/components/book/facilitator-notes/facilitator-notes.component.spec.ts @@ -1,9 +1,10 @@ -/* tslint:disable:no-unused-variable */ +import { AppConfigModule } from './../../../app-config.module'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; -import { DebugElement } from '@angular/core'; import { FacilitatorNotesComponent } from './facilitator-notes.component'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; describe('FacilitatorNotesComponent', () => { let component: FacilitatorNotesComponent; @@ -11,7 +12,14 @@ describe('FacilitatorNotesComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [FacilitatorNotesComponent] + imports: [ + FormsModule, + ReactiveFormsModule, + HttpClientTestingModule, + AppConfigModule, + ], + declarations: [FacilitatorNotesComponent], + providers: [NgbActiveModal], }).compileComponents(); })); @@ -21,7 +29,7 @@ describe('FacilitatorNotesComponent', () => { fixture.detectChanges(); }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + // it('should create', () => { + // expect(component).toBeTruthy(); + // }); }); diff --git a/src/app/components/book/form/form.component.spec.ts b/src/app/components/book/form/form.component.spec.ts index 555c26ac..2c36ee2f 100644 --- a/src/app/components/book/form/form.component.spec.ts +++ b/src/app/components/book/form/form.component.spec.ts @@ -1,17 +1,22 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ToastrModule } from 'ngx-toastr'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { ImageUploadModule } from 'ng2-imageupload'; import { NgbModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; import { RouterTestingModule } from '@angular/router/testing'; -import { HttpClient, HttpHandler } from '@angular/common/http'; -import { Ng2ImgMaxService, ImgMaxSizeService, ImgExifService, ImgMaxPXSizeService } from 'ng2-img-max'; +import { + Ng2ImgMaxService, + ImgMaxSizeService, + ImgExifService, + ImgMaxPXSizeService, +} from 'ng2-img-max'; import { Ng2PicaService, ImgExifService as ImgPicaService } from 'ng2-pica'; import { FormComponent } from './form.component'; import { AppConfigModule } from '../../../app-config.module'; import { UserService } from '../../../core/services/user/user.service'; -import { ToastrService } from 'ngx-toastr'; describe('FormComponent', () => { let component: FormComponent; @@ -27,20 +32,19 @@ describe('FormComponent', () => { NgbModule.forRoot(), NgbModalModule, RouterTestingModule, - AppConfigModule + AppConfigModule, + ToastrModule.forRoot(), + HttpClientTestingModule, ], providers: [ - HttpClient, - HttpHandler, UserService, - Ng2ImgMaxService, ImgMaxSizeService, ImgExifService, ImgMaxPXSizeService, Ng2PicaService, - ImgPicaService - ] + ImgPicaService, + ], }).compileComponents(); })); diff --git a/src/app/components/book/list/list.component.spec.ts b/src/app/components/book/list/list.component.spec.ts index 48d673d6..c9f4ef7d 100644 --- a/src/app/components/book/list/list.component.spec.ts +++ b/src/app/components/book/list/list.component.spec.ts @@ -1,3 +1,4 @@ +import { ToastrModule } from 'ngx-toastr'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { Ng2SmartTableModule } from 'ng2-smart-table'; import { RouterTestingModule } from '@angular/router/testing'; @@ -7,7 +8,6 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { ListComponent } from './list.component'; import { AppConfigModule } from '../../../app-config.module'; -import { ToastrService } from 'ngx-toastr'; import { ConfirmationDialogService } from '../../../core/services/confirmation-dialog/confirmation-dialog.service'; describe('ListComponent', () => { @@ -24,9 +24,10 @@ describe('ListComponent', () => { NgbModule.forRoot(), NgbModalModule, FormsModule, - ReactiveFormsModule + ReactiveFormsModule, + ToastrModule.forRoot(), ], - providers: [ConfirmationDialogService] + providers: [ConfirmationDialogService], }).compileComponents(); })); diff --git a/src/app/components/book/main-users/main-users.component.spec.ts b/src/app/components/book/main-users/main-users.component.spec.ts index d905175c..49b390b3 100644 --- a/src/app/components/book/main-users/main-users.component.spec.ts +++ b/src/app/components/book/main-users/main-users.component.spec.ts @@ -1,7 +1,7 @@ -/* tslint:disable:no-unused-variable */ +import { AppConfigModule } from './../../../app-config.module'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; -import { DebugElement } from '@angular/core'; import { MainUsersComponent } from './main-users.component'; @@ -11,7 +11,9 @@ describe('MainUsersComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [MainUsersComponent] + declarations: [MainUsersComponent], + imports: [HttpClientTestingModule, AppConfigModule], + providers: [NgbActiveModal], }).compileComponents(); })); diff --git a/src/app/components/book/request/request.component.spec.ts b/src/app/components/book/request/request.component.spec.ts index bd6fa0a3..d0fb5d87 100644 --- a/src/app/components/book/request/request.component.spec.ts +++ b/src/app/components/book/request/request.component.spec.ts @@ -1,8 +1,9 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ToastrModule } from 'ngx-toastr'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { NgbModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { HttpClient, HttpHandler } from '@angular/common/http'; import { RouterTestingModule } from '@angular/router/testing'; import { Ng2SmartTableModule } from 'ng2-smart-table'; @@ -10,7 +11,6 @@ import { RequestComponent } from './request.component'; import { AppConfigModule } from '../../../app-config.module'; import { UserService } from '../../../core/services/user/user.service'; -import { ToastrService } from 'ngx-toastr'; describe('RequestComponent', () => { let component: RequestComponent; @@ -27,8 +27,10 @@ describe('RequestComponent', () => { Ng2SmartTableModule, AppConfigModule, RouterTestingModule, + ToastrModule.forRoot(), + HttpClientTestingModule, ], - providers: [NgbActiveModal, HttpClient, HttpHandler, UserService], + providers: [NgbActiveModal, UserService], }).compileComponents(); })); diff --git a/src/app/components/book/search-results/search-results.component.spec.ts b/src/app/components/book/search-results/search-results.component.spec.ts index 6f9f7852..1979dd21 100644 --- a/src/app/components/book/search-results/search-results.component.spec.ts +++ b/src/app/components/book/search-results/search-results.component.spec.ts @@ -1,6 +1,11 @@ +import { ToastrModule } from 'ngx-toastr'; +import { AppConfigModule } from './../../../app-config.module'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { RouterTestingModule } from '@angular/router/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { SearchResultsComponent } from './search-results.component'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; describe('SearchResultsComponent', () => { let component: SearchResultsComponent; @@ -8,7 +13,14 @@ describe('SearchResultsComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [SearchResultsComponent] + declarations: [SearchResultsComponent], + schemas: [NO_ERRORS_SCHEMA], + imports: [ + RouterTestingModule, + HttpClientTestingModule, + AppConfigModule, + ToastrModule.forRoot(), + ], }).compileComponents(); })); diff --git a/src/app/components/book/tracking/tracking.component.spec.ts b/src/app/components/book/tracking/tracking.component.spec.ts index f1a3d710..8282d6ca 100644 --- a/src/app/components/book/tracking/tracking.component.spec.ts +++ b/src/app/components/book/tracking/tracking.component.spec.ts @@ -1,10 +1,7 @@ -/* tslint:disable:no-unused-variable */ +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; -import { DebugElement } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { HttpClient, HttpHandler } from '@angular/common/http'; import { TrackingComponent } from './tracking.component'; import { AppConfigModule } from '../../../app-config.module'; @@ -16,8 +13,13 @@ describe('TrackingComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [TrackingComponent], - imports: [FormsModule, ReactiveFormsModule, AppConfigModule], - providers: [NgbActiveModal, HttpClient, HttpHandler] + imports: [ + FormsModule, + ReactiveFormsModule, + AppConfigModule, + HttpClientTestingModule, + ], + providers: [NgbActiveModal], }).compileComponents(); })); diff --git a/src/app/components/card-book/card-book.component.spec.ts b/src/app/components/card-book/card-book.component.spec.ts index 4c688155..93ec406c 100644 --- a/src/app/components/card-book/card-book.component.spec.ts +++ b/src/app/components/card-book/card-book.component.spec.ts @@ -1,24 +1,56 @@ +import { RouterTestingModule } from '@angular/router/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { CardBookComponent } from './card-book.component'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { Component, ViewChild } from '@angular/core'; describe('CardBookComponent', () => { - let component: CardBookComponent; - let fixture: ComponentFixture; + @Component({ + selector: `app-test-card-book`, + template: ``, + }) + class TestCardBookComponent { + @ViewChild(CardBookComponent) + public cardBookComponent: CardBookComponent; + } + + let component: TestCardBookComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [CardBookComponent] + imports: [RouterTestingModule, FormsModule, ReactiveFormsModule], + declarations: [CardBookComponent, TestCardBookComponent], }).compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(CardBookComponent); + fixture = TestBed.createComponent(TestCardBookComponent); component = fixture.componentInstance; fixture.detectChanges(); }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + // it('should show TEST INPUT', () => { + // const book = { + // title: 'Como desenhar super-heróis', + // slug: 'como-desenhar-super-herois', + // imageUrl: + // 'https://www.sharebook.com.br/Images/Books/como-desenhar-super-herois.jpeg', + // approved: true, + // }; + // component.cardBookComponent.content = book; + // fixture.detectChanges(); + // expect(fixture.nativeElement.querySelector('card-title').innerText).toEqual( + // book.title + // ); + // }); + + // it('should show DIFFERENT TEST INPUT', () => { + // component.cardBookComponent.content = 'different test input'; + // fixture.detectChanges(); + // expect(fixture.nativeElement.querySelector('div').innerText).toEqual( + // 'DIFFERENT TEST INPUT' + // ); + // }); }); diff --git a/src/app/components/change-password/change-password.component.spec.ts b/src/app/components/change-password/change-password.component.spec.ts index 68809fa0..2d191aae 100644 --- a/src/app/components/change-password/change-password.component.spec.ts +++ b/src/app/components/change-password/change-password.component.spec.ts @@ -1,16 +1,13 @@ -/* tslint:disable:no-unused-variable */ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ToastrModule } from 'ngx-toastr'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; -import { DebugElement } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { RouterTestingModule } from '@angular/router/testing'; -import { HttpClient, HttpHandler } from '@angular/common/http'; import { ChangePasswordComponent } from './change-password.component'; import { AppConfigModule } from '../../app-config.module'; import { UserService } from '../../core/services/user/user.service'; -import { ToastrService } from 'ngx-toastr'; describe('ChangePasswordComponent', () => { let component: ChangePasswordComponent; @@ -24,8 +21,10 @@ describe('ChangePasswordComponent', () => { ReactiveFormsModule, RouterTestingModule, AppConfigModule, + ToastrModule.forRoot(), + HttpClientTestingModule, ], - providers: [UserService, HttpClient, HttpHandler], + providers: [UserService], }).compileComponents(); })); @@ -35,7 +34,7 @@ describe('ChangePasswordComponent', () => { fixture.detectChanges(); }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + // it('should create', () => { + // expect(component).toBeTruthy(); + // }); }); diff --git a/src/app/components/contact-us/contact-us.component.spec.ts b/src/app/components/contact-us/contact-us.component.spec.ts index af087c3f..4c30dcc3 100644 --- a/src/app/components/contact-us/contact-us.component.spec.ts +++ b/src/app/components/contact-us/contact-us.component.spec.ts @@ -1,9 +1,10 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ToastrModule } from 'ngx-toastr'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { NgxMaskModule } from 'ngx-mask'; import { RecaptchaFormsModule } from 'ng-recaptcha/forms'; import { RecaptchaModule } from 'ng-recaptcha'; -import { HttpClient, HttpHandler } from '@angular/common/http'; import { RouterTestingModule } from '@angular/router/testing'; import { ContactUsComponent } from './contact-us.component'; @@ -25,8 +26,9 @@ describe('ContactUsComponent', () => { RecaptchaFormsModule, AppConfigModule, RouterTestingModule, + ToastrModule.forRoot(), + HttpClientTestingModule, ], - providers: [HttpClient, HttpHandler], }).compileComponents(); })); diff --git a/src/app/components/forgot-password/forgot-password.component.spec.ts b/src/app/components/forgot-password/forgot-password.component.spec.ts index 6039f6f8..f44f3c26 100644 --- a/src/app/components/forgot-password/forgot-password.component.spec.ts +++ b/src/app/components/forgot-password/forgot-password.component.spec.ts @@ -1,16 +1,13 @@ -/* tslint:disable:no-unused-variable */ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ToastrModule } from 'ngx-toastr'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; -import { DebugElement } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { RouterTestingModule } from '@angular/router/testing'; -import { HttpClient, HttpHandler } from '@angular/common/http'; import { ForgotPasswordComponent } from './forgot-password.component'; import { AppConfigModule } from '../../app-config.module'; import { UserService } from '../../core/services/user/user.service'; -import { ToastrService } from 'ngx-toastr'; describe('ForgotPasswordComponent', () => { let component: ForgotPasswordComponent; @@ -24,8 +21,10 @@ describe('ForgotPasswordComponent', () => { ReactiveFormsModule, RouterTestingModule, AppConfigModule, + ToastrModule.forRoot(), + HttpClientTestingModule, ], - providers: [UserService, HttpClient, HttpHandler], + providers: [UserService], }).compileComponents(); })); @@ -35,7 +34,7 @@ describe('ForgotPasswordComponent', () => { fixture.detectChanges(); }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + // it('should create', () => { + // expect(component).toBeTruthy(); + // }); }); diff --git a/src/app/components/header/header.component.spec.ts b/src/app/components/header/header.component.spec.ts index 03e4e32b..cd82a39a 100644 --- a/src/app/components/header/header.component.spec.ts +++ b/src/app/components/header/header.component.spec.ts @@ -1,5 +1,5 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { HttpClient, HttpHandler } from '@angular/common/http'; import { RouterTestingModule } from '@angular/router/testing'; import { HeaderComponent } from './header.component'; @@ -15,8 +15,8 @@ describe('HeaderComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [HeaderComponent], - imports: [AppConfigModule, RouterTestingModule], - providers: [UserService, HttpClient, HttpHandler, AuthenticationService] + imports: [AppConfigModule, RouterTestingModule, HttpClientTestingModule], + providers: [UserService, AuthenticationService], }).compileComponents(); })); diff --git a/src/app/components/home/home.component.spec.ts b/src/app/components/home/home.component.spec.ts index 24f5b9af..50c24f2c 100644 --- a/src/app/components/home/home.component.spec.ts +++ b/src/app/components/home/home.component.spec.ts @@ -1,5 +1,6 @@ +import { RouterTestingModule } from '@angular/router/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { HttpClient, HttpHandler } from '@angular/common/http'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { HomeComponent } from './home.component'; @@ -13,8 +14,13 @@ describe('HomeComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [HomeComponent], - imports: [AppConfigModule, FormsModule, ReactiveFormsModule], - providers: [HttpClient, HttpHandler] + imports: [ + AppConfigModule, + FormsModule, + ReactiveFormsModule, + HttpClientTestingModule, + RouterTestingModule + ], }).compileComponents(); })); diff --git a/src/app/components/login/login.component.spec.ts b/src/app/components/login/login.component.spec.ts index 593f3923..7fcf4f3c 100644 --- a/src/app/components/login/login.component.spec.ts +++ b/src/app/components/login/login.component.spec.ts @@ -1,7 +1,7 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { RouterTestingModule } from '@angular/router/testing'; -import { HttpClient, HttpHandler } from '@angular/common/http'; import { LoginComponent } from './login.component'; import { AuthenticationService } from '../../core/services/authentication/authentication.service'; @@ -16,8 +16,14 @@ describe('LoginComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [LoginComponent], - imports: [FormsModule, ReactiveFormsModule, RouterTestingModule, AppConfigModule], - providers: [AuthenticationService, UserService, HttpClient, HttpHandler] + imports: [ + FormsModule, + ReactiveFormsModule, + RouterTestingModule, + AppConfigModule, + HttpClientTestingModule, + ], + providers: [AuthenticationService, UserService], }).compileComponents(); })); diff --git a/src/app/components/panel/panel.component.spec.ts b/src/app/components/panel/panel.component.spec.ts index fa9c3a8e..43648c26 100644 --- a/src/app/components/panel/panel.component.spec.ts +++ b/src/app/components/panel/panel.component.spec.ts @@ -1,8 +1,5 @@ -/* tslint:disable:no-unused-variable */ +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; -import { DebugElement } from '@angular/core'; -import { HttpClient, HttpHandler } from '@angular/common/http'; import { PanelComponent } from './panel.component'; @@ -16,8 +13,8 @@ describe('PanelComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [PanelComponent], - imports: [AppConfigModule], - providers: [UserService, HttpClient, HttpHandler] + imports: [AppConfigModule, HttpClientTestingModule], + providers: [UserService], }).compileComponents(); })); diff --git a/src/app/components/register/register.component.spec.ts b/src/app/components/register/register.component.spec.ts index a91e2234..b8d4caf1 100644 --- a/src/app/components/register/register.component.spec.ts +++ b/src/app/components/register/register.component.spec.ts @@ -1,14 +1,14 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ToastrModule } from 'ngx-toastr'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { NgxMaskModule } from 'ngx-mask'; import { RouterTestingModule } from '@angular/router/testing'; -import { HttpClient, HttpHandler } from '@angular/common/http'; import { RegisterComponent } from './register.component'; import { AppConfigModule } from '../../app-config.module'; import { UserService } from '../../core/services/user/user.service'; -import { ToastrService } from 'ngx-toastr'; import { AddressService } from '../../core/services/address/address.service'; describe('RegisterComponent', () => { @@ -18,8 +18,16 @@ describe('RegisterComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [RegisterComponent], - imports: [FormsModule, ReactiveFormsModule, NgxMaskModule.forRoot(), RouterTestingModule, AppConfigModule], - providers: [UserService, AddressService, HttpClient, HttpHandler] + imports: [ + FormsModule, + ReactiveFormsModule, + NgxMaskModule.forRoot(), + RouterTestingModule, + AppConfigModule, + ToastrModule.forRoot(), + HttpClientTestingModule, + ], + providers: [UserService, AddressService], }).compileComponents(); })); diff --git a/src/app/components/reset-password/reset-password.component.spec.ts b/src/app/components/reset-password/reset-password.component.spec.ts index c76bb99d..f2ce02e1 100644 --- a/src/app/components/reset-password/reset-password.component.spec.ts +++ b/src/app/components/reset-password/reset-password.component.spec.ts @@ -1,16 +1,13 @@ -/* tslint:disable:no-unused-variable */ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ToastrModule } from 'ngx-toastr'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; -import { DebugElement } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { RouterTestingModule } from '@angular/router/testing'; -import { HttpClient, HttpHandler } from '@angular/common/http'; import { ResetPasswordComponent } from './reset-password.component'; import { AppConfigModule } from '../../app-config.module'; import { UserService } from '../../core/services/user/user.service'; -import { ToastrService } from 'ngx-toastr'; describe('ResetPasswordComponent', () => { let component: ResetPasswordComponent; @@ -19,8 +16,15 @@ describe('ResetPasswordComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ResetPasswordComponent], - imports: [FormsModule, ReactiveFormsModule, RouterTestingModule, AppConfigModule], - providers: [UserService, HttpClient, HttpHandler] + imports: [ + FormsModule, + ReactiveFormsModule, + RouterTestingModule, + AppConfigModule, + ToastrModule.forRoot(), + HttpClientTestingModule, + ], + providers: [UserService], }).compileComponents(); })); diff --git a/src/app/core/services/address/address.service.spec.ts b/src/app/core/services/address/address.service.spec.ts index f2032553..6845798f 100644 --- a/src/app/core/services/address/address.service.spec.ts +++ b/src/app/core/services/address/address.service.spec.ts @@ -1,13 +1,13 @@ -/* tslint:disable:no-unused-variable */ +import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { TestBed, async, inject } from '@angular/core/testing'; +import { TestBed, inject } from '@angular/core/testing'; import { AddressService } from './address.service'; -import { HttpClient, HttpHandler } from '@angular/common/http'; describe('AddressService', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [AddressService, HttpClient, HttpHandler] + imports: [HttpClientTestingModule], + providers: [AddressService], }); }); diff --git a/src/app/core/services/authentication/authentication.service.spec.ts b/src/app/core/services/authentication/authentication.service.spec.ts index 7946f791..cf95e38c 100644 --- a/src/app/core/services/authentication/authentication.service.spec.ts +++ b/src/app/core/services/authentication/authentication.service.spec.ts @@ -1,20 +1,23 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed, inject } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { AuthenticationService } from './authentication.service'; -import { HttpClient, HttpHandler } from '@angular/common/http'; import { UserService } from '../user/user.service'; import { AppConfigModule } from '../../../app-config.module'; describe('AuthenticationService', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [AuthenticationService, HttpClient, HttpHandler, UserService], - imports: [RouterTestingModule, AppConfigModule] + imports: [RouterTestingModule, AppConfigModule, HttpClientTestingModule], + providers: [AuthenticationService, UserService], }); }); - it('should be created', inject([AuthenticationService], (service: AuthenticationService) => { - expect(service).toBeTruthy(); - })); + it('should be created', inject( + [AuthenticationService], + (service: AuthenticationService) => { + expect(service).toBeTruthy(); + } + )); }); diff --git a/src/app/core/services/book/book.service.spec.ts b/src/app/core/services/book/book.service.spec.ts index 3d84ec4d..0dae349c 100644 --- a/src/app/core/services/book/book.service.spec.ts +++ b/src/app/core/services/book/book.service.spec.ts @@ -1,5 +1,5 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed, inject } from '@angular/core/testing'; -import { HttpClient, HttpHandler } from '@angular/common/http'; import { BookService } from './book.service'; @@ -8,8 +8,8 @@ import { AppConfigModule } from '../../../app-config.module'; describe('BookService', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [BookService, HttpClient, HttpHandler], - imports: [AppConfigModule] + imports: [AppConfigModule, HttpClientTestingModule], + providers: [BookService], }); }); diff --git a/src/app/core/services/category/category.service.spec.ts b/src/app/core/services/category/category.service.spec.ts index 4873b50d..3ca76f54 100644 --- a/src/app/core/services/category/category.service.spec.ts +++ b/src/app/core/services/category/category.service.spec.ts @@ -1,5 +1,5 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed, inject } from '@angular/core/testing'; -import { HttpClient, HttpHandler } from '@angular/common/http'; import { CategoryService } from './category.service'; import { AppConfigModule } from '../../../app-config.module'; @@ -7,12 +7,15 @@ import { AppConfigModule } from '../../../app-config.module'; describe('CategoryService', () => { beforeEach(() => { TestBed.configureTestingModule({ - imports: [AppConfigModule], - providers: [CategoryService, HttpClient, HttpHandler] + imports: [AppConfigModule, HttpClientTestingModule], + providers: [CategoryService], }); }); - it('should be created', inject([CategoryService], (service: CategoryService) => { - expect(service).toBeTruthy(); - })); + it('should be created', inject( + [CategoryService], + (service: CategoryService) => { + expect(service).toBeTruthy(); + } + )); }); diff --git a/src/app/core/services/contact-us/contact-us.service.spec.ts b/src/app/core/services/contact-us/contact-us.service.spec.ts index e9c0094c..55274deb 100644 --- a/src/app/core/services/contact-us/contact-us.service.spec.ts +++ b/src/app/core/services/contact-us/contact-us.service.spec.ts @@ -1,5 +1,5 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed, inject } from '@angular/core/testing'; -import { HttpClient, HttpHandler } from '@angular/common/http'; import { ContactUsService } from './contact-us.service'; import { AppConfigModule } from '../../../app-config.module'; @@ -7,12 +7,15 @@ import { AppConfigModule } from '../../../app-config.module'; describe('ContactUsService', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [ContactUsService, HttpClient, HttpHandler], - imports: [AppConfigModule] + imports: [AppConfigModule, HttpClientTestingModule], + providers: [ContactUsService], }); }); - it('should be created', inject([ContactUsService], (service: ContactUsService) => { - expect(service).toBeTruthy(); - })); + it('should be created', inject( + [ContactUsService], + (service: ContactUsService) => { + expect(service).toBeTruthy(); + } + )); }); diff --git a/src/app/core/services/user/user.service.spec.ts b/src/app/core/services/user/user.service.spec.ts index 7cd86873..a07a0fa9 100644 --- a/src/app/core/services/user/user.service.spec.ts +++ b/src/app/core/services/user/user.service.spec.ts @@ -1,5 +1,5 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed, inject } from '@angular/core/testing'; -import { HttpClient, HttpHandler } from '@angular/common/http'; import { UserService } from './user.service'; @@ -8,8 +8,8 @@ import { AppConfigModule } from '../../../app-config.module'; describe('UserService', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [UserService, HttpClient, HttpHandler], - imports: [AppConfigModule] + imports: [AppConfigModule, HttpClientTestingModule], + providers: [UserService], }); }); From 2efe12a89d3b66a7c5d086586fc6bf4117716106 Mon Sep 17 00:00:00 2001 From: William Pavei Antero Date: Sat, 30 May 2020 12:02:37 -0300 Subject: [PATCH 07/34] test with no-progress --- karma.conf.js | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/karma.conf.js b/karma.conf.js index 8cc48da6..3936415c 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -25,9 +25,9 @@ module.exports = function (config) { colors: true, logLevel: config.LOG_INFO, autoWatch: true, - browsers: ['ChromeHeadlessNoSandbox'], + browsers: ['Chrome'], customLaunchers: { - ChromeHeadlessNoSandbox: { + ChromeHeadlessCI: { base: 'ChromeHeadless', flags: ['--no-sandbox'], }, diff --git a/package.json b/package.json index eb278fdf..04b09871 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "build-dev": "ng build", "build-stg": "ng build --configuration=stage", "build-prod": "ng build --configuration=production", - "test": "ng test --codeCoverage=true --watch=false", + "test": "ng test --no-watch --no-progress --code-coverage --browsers=ChromeHeadlessCI", "lint": "ng lint", "e2e": "ng e2e", "precommit": "npm run lint", From e422560e272d571a0d06aa752d6d2fe0a7143bb4 Mon Sep 17 00:00:00 2001 From: William Pavei Antero Date: Tue, 2 Jun 2020 00:28:31 -0300 Subject: [PATCH 08/34] test debug --- .vscode/launch.json | 9 +++++++++ karma.conf.js | 4 ++++ package.json | 1 + 3 files changed, 14 insertions(+) diff --git a/.vscode/launch.json b/.vscode/launch.json index 25420055..2b7989bd 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,6 +10,15 @@ "name": "Launch Chrome against localhost", "url": "http://localhost:4200", "webRoot": "${workspaceFolder}" + }, + { + "type": "chrome", + "request": "attach", + "name": "Unit tests", + "address": "localhost", + "port": 9333, + "sourceMaps": true, + "webRoot": "${workspaceFolder}" } ] } diff --git a/karma.conf.js b/karma.conf.js index 3936415c..a71f2fdd 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -31,6 +31,10 @@ module.exports = function (config) { base: 'ChromeHeadless', flags: ['--no-sandbox'], }, + ChromeDebug: { + base: 'Chrome', + flags: ['--remote-debugging-port=9333'], + }, }, singleRun: false, restartOnFileChange: true, diff --git a/package.json b/package.json index 04b09871..1971fdfc 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "build-dev": "ng build", "build-stg": "ng build --configuration=stage", "build-prod": "ng build --configuration=production", + "test-debug": "ng test --browsers ChromeDebug", "test": "ng test --no-watch --no-progress --code-coverage --browsers=ChromeHeadlessCI", "lint": "ng lint", "e2e": "ng e2e", From f65f89a30205a90d8b15bcdafd0717d3bdc6f384 Mon Sep 17 00:00:00 2001 From: William Pavei Antero Date: Tue, 2 Jun 2020 00:31:04 -0300 Subject: [PATCH 09/34] should create test for all components --- src/app/app.component.spec.ts | 12 +---- .../donate-page/donate-page.component.spec.ts | 5 -- .../facilitator-notes.component.spec.ts | 11 ++-- .../card-book/card-book.component.spec.ts | 53 ++++++------------- .../change-password.component.spec.ts | 6 +-- .../forgot-password.component.spec.ts | 17 ++++-- .../header/header.component.spec.ts | 6 ++- .../input-search.component.spec.ts | 27 ++++++++++ .../input-search/input-search.module.spec.ts | 13 +++++ .../components/login/login.component.spec.ts | 7 +-- 10 files changed, 88 insertions(+), 69 deletions(-) create mode 100644 src/app/components/input-search/input-search.component.spec.ts create mode 100644 src/app/components/input-search/input-search.module.spec.ts diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 5dfaf740..936fbc02 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -20,20 +20,10 @@ describe('AppComponent', () => { providers: [UserService, AuthenticationService], }).compileComponents(); })); + it('should create the app', async(() => { const fixture = TestBed.createComponent(AppComponent); const app = fixture.debugElement.componentInstance; expect(app).toBeTruthy(); })); - /*it(`should have as title 'app'`, async(() => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.debugElement.componentInstance; - expect(app.title).toEqual('app'); - })); - it('should render title in a h1 tag', async(() => { - const fixture = TestBed.createComponent(AppComponent); - fixture.detectChanges(); - const compiled = fixture.debugElement.nativeElement; - expect(compiled.querySelector('h1').textContent).toContain('Welcome to angular!'); - }));*/ }); diff --git a/src/app/components/book/donate-page/donate-page.component.spec.ts b/src/app/components/book/donate-page/donate-page.component.spec.ts index d7e2e5c1..3d6c5c06 100644 --- a/src/app/components/book/donate-page/donate-page.component.spec.ts +++ b/src/app/components/book/donate-page/donate-page.component.spec.ts @@ -2,7 +2,6 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { AppConfigModule } from './../../../app-config.module'; import { AddressService } from './../../../core/services/address/address.service'; import { RouterTestingModule } from '@angular/router/testing'; -// import { ActivatedRoute } from '@angular/router'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { HttpClientTestingModule } from '@angular/common/http/testing'; @@ -13,10 +12,6 @@ describe('DonatePageComponent', () => { let component: DonatePageComponent; let fixture: ComponentFixture; - // const fakeActivatedRoute = { - // snapshot: { data: {} }, - // } as ActivatedRoute; - beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [DonatePageComponent], diff --git a/src/app/components/book/facilitator-notes/facilitator-notes.component.spec.ts b/src/app/components/book/facilitator-notes/facilitator-notes.component.spec.ts index 404bb5a2..46471db1 100644 --- a/src/app/components/book/facilitator-notes/facilitator-notes.component.spec.ts +++ b/src/app/components/book/facilitator-notes/facilitator-notes.component.spec.ts @@ -26,10 +26,13 @@ describe('FacilitatorNotesComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(FacilitatorNotesComponent); component = fixture.componentInstance; - fixture.detectChanges(); }); - // it('should create', () => { - // expect(component).toBeTruthy(); - // }); + it('should create', () => { + component.bookId = '9eb3fe55-d195-4f9b-9533-08d6eae2daab'; + component.bookTitle = 'My Book'; + component.facilitatorNotes = 'My Notes for book'; + fixture.detectChanges(); + expect(component).toBeTruthy(); + }); }); diff --git a/src/app/components/card-book/card-book.component.spec.ts b/src/app/components/card-book/card-book.component.spec.ts index 93ec406c..3849bef0 100644 --- a/src/app/components/card-book/card-book.component.spec.ts +++ b/src/app/components/card-book/card-book.component.spec.ts @@ -3,54 +3,33 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { CardBookComponent } from './card-book.component'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { Component, ViewChild } from '@angular/core'; describe('CardBookComponent', () => { - @Component({ - selector: `app-test-card-book`, - template: ``, - }) - class TestCardBookComponent { - @ViewChild(CardBookComponent) - public cardBookComponent: CardBookComponent; - } - - let component: TestCardBookComponent; - let fixture: ComponentFixture; + let component: CardBookComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ imports: [RouterTestingModule, FormsModule, ReactiveFormsModule], - declarations: [CardBookComponent, TestCardBookComponent], + declarations: [CardBookComponent, CardBookComponent], }).compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(TestCardBookComponent); + fixture = TestBed.createComponent(CardBookComponent); component = fixture.componentInstance; - fixture.detectChanges(); }); - // it('should show TEST INPUT', () => { - // const book = { - // title: 'Como desenhar super-heróis', - // slug: 'como-desenhar-super-herois', - // imageUrl: - // 'https://www.sharebook.com.br/Images/Books/como-desenhar-super-herois.jpeg', - // approved: true, - // }; - // component.cardBookComponent.content = book; - // fixture.detectChanges(); - // expect(fixture.nativeElement.querySelector('card-title').innerText).toEqual( - // book.title - // ); - // }); - - // it('should show DIFFERENT TEST INPUT', () => { - // component.cardBookComponent.content = 'different test input'; - // fixture.detectChanges(); - // expect(fixture.nativeElement.querySelector('div').innerText).toEqual( - // 'DIFFERENT TEST INPUT' - // ); - // }); + it('should create', () => { + const book = { + title: 'Como desenhar super-heróis', + slug: 'como-desenhar-super-herois', + imageUrl: + 'https://www.sharebook.com.br/Images/Books/como-desenhar-super-herois.jpeg', + approved: true, + }; + component.content = book; + fixture.detectChanges(); + expect(component).toBeTruthy(); + }); }); diff --git a/src/app/components/change-password/change-password.component.spec.ts b/src/app/components/change-password/change-password.component.spec.ts index 2d191aae..e4ac91a8 100644 --- a/src/app/components/change-password/change-password.component.spec.ts +++ b/src/app/components/change-password/change-password.component.spec.ts @@ -34,7 +34,7 @@ describe('ChangePasswordComponent', () => { fixture.detectChanges(); }); - // it('should create', () => { - // expect(component).toBeTruthy(); - // }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/src/app/components/forgot-password/forgot-password.component.spec.ts b/src/app/components/forgot-password/forgot-password.component.spec.ts index f44f3c26..635b4eeb 100644 --- a/src/app/components/forgot-password/forgot-password.component.spec.ts +++ b/src/app/components/forgot-password/forgot-password.component.spec.ts @@ -8,10 +8,13 @@ import { ForgotPasswordComponent } from './forgot-password.component'; import { AppConfigModule } from '../../app-config.module'; import { UserService } from '../../core/services/user/user.service'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; describe('ForgotPasswordComponent', () => { let component: ForgotPasswordComponent; let fixture: ComponentFixture; + const hashCodeValue: String = '961bf5da-cdfc-4603-a03b-dcfcbba1e5af'; beforeEach(async(() => { TestBed.configureTestingModule({ @@ -24,7 +27,13 @@ describe('ForgotPasswordComponent', () => { ToastrModule.forRoot(), HttpClientTestingModule, ], - providers: [UserService], + providers: [ + UserService, + { + provide: ActivatedRoute, + useValue: { params: of({ hashCodePassword: hashCodeValue }) }, + }, + ], }).compileComponents(); })); @@ -34,7 +43,7 @@ describe('ForgotPasswordComponent', () => { fixture.detectChanges(); }); - // it('should create', () => { - // expect(component).toBeTruthy(); - // }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/src/app/components/header/header.component.spec.ts b/src/app/components/header/header.component.spec.ts index cd82a39a..aae4f6d1 100644 --- a/src/app/components/header/header.component.spec.ts +++ b/src/app/components/header/header.component.spec.ts @@ -7,6 +7,7 @@ import { HeaderComponent } from './header.component'; import { AppConfigModule } from '../../app-config.module'; import { UserService } from '../../core/services/user/user.service'; import { AuthenticationService } from '../../core/services/authentication/authentication.service'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; describe('HeaderComponent', () => { let component: HeaderComponent; @@ -15,6 +16,7 @@ describe('HeaderComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [HeaderComponent], + schemas: [NO_ERRORS_SCHEMA], imports: [AppConfigModule, RouterTestingModule, HttpClientTestingModule], providers: [UserService, AuthenticationService], }).compileComponents(); @@ -26,7 +28,7 @@ describe('HeaderComponent', () => { fixture.detectChanges(); }); - /*it('should create', () => { + it('should create', () => { expect(component).toBeTruthy(); - });*/ + }); }); diff --git a/src/app/components/input-search/input-search.component.spec.ts b/src/app/components/input-search/input-search.component.spec.ts new file mode 100644 index 00000000..4c499626 --- /dev/null +++ b/src/app/components/input-search/input-search.component.spec.ts @@ -0,0 +1,27 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { InputSearchComponent } from './input-search.component'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { RouterTestingModule } from '@angular/router/testing'; + +describe('InputSearchComponent', () => { + let component: InputSearchComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [InputSearchComponent], + imports: [FormsModule, ReactiveFormsModule, RouterTestingModule], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(InputSearchComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/input-search/input-search.module.spec.ts b/src/app/components/input-search/input-search.module.spec.ts new file mode 100644 index 00000000..99ce588c --- /dev/null +++ b/src/app/components/input-search/input-search.module.spec.ts @@ -0,0 +1,13 @@ +import { InputSearchModule } from './input-search.module'; + +describe('InputSearchModule', () => { + let inputSearchModule: InputSearchModule; + + beforeEach(() => { + inputSearchModule = new InputSearchModule(); + }); + + it('should create an instance', () => { + expect(inputSearchModule).toBeTruthy(); + }); +}); diff --git a/src/app/components/login/login.component.spec.ts b/src/app/components/login/login.component.spec.ts index 7fcf4f3c..46e5591d 100644 --- a/src/app/components/login/login.component.spec.ts +++ b/src/app/components/login/login.component.spec.ts @@ -7,7 +7,7 @@ import { LoginComponent } from './login.component'; import { AuthenticationService } from '../../core/services/authentication/authentication.service'; import { UserService } from '../../core/services/user/user.service'; import { AppConfigModule } from '../../app-config.module'; -import { ToastrService } from 'ngx-toastr'; +import { ToastrModule } from 'ngx-toastr'; describe('LoginComponent', () => { let component: LoginComponent; @@ -22,6 +22,7 @@ describe('LoginComponent', () => { RouterTestingModule, AppConfigModule, HttpClientTestingModule, + ToastrModule.forRoot(), ], providers: [AuthenticationService, UserService], }).compileComponents(); @@ -33,7 +34,7 @@ describe('LoginComponent', () => { fixture.detectChanges(); }); - /*it('should create', () => { + it('should create', () => { expect(component).toBeTruthy(); - });*/ + }); }); From a35a7523c17a8991232d6a277b9cfde3329382d8 Mon Sep 17 00:00:00 2001 From: William Pavei Antero Date: Tue, 2 Jun 2020 00:35:02 -0300 Subject: [PATCH 10/34] fix code smell --- .../forgot-password/forgot-password.component.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/components/forgot-password/forgot-password.component.spec.ts b/src/app/components/forgot-password/forgot-password.component.spec.ts index 635b4eeb..9fcc4337 100644 --- a/src/app/components/forgot-password/forgot-password.component.spec.ts +++ b/src/app/components/forgot-password/forgot-password.component.spec.ts @@ -14,7 +14,7 @@ import { of } from 'rxjs'; describe('ForgotPasswordComponent', () => { let component: ForgotPasswordComponent; let fixture: ComponentFixture; - const hashCodeValue: String = '961bf5da-cdfc-4603-a03b-dcfcbba1e5af'; + const hashCodeValue = '961bf5da-cdfc-4603-a03b-dcfcbba1e5af'; beforeEach(async(() => { TestBed.configureTestingModule({ From e8e75e53fdca60fe5c84a4e9bffc7799bc1a3cb9 Mon Sep 17 00:00:00 2001 From: Raffaello Damgaard Date: Sun, 31 May 2020 15:34:10 -0300 Subject: [PATCH 11/34] Contribuidores backend. --- .../contributors/contributors.service.ts | 151 +++++++++++------- .../img/top_contributors/flavio-landes.jpeg | Bin 0 -> 59157 bytes .../img/top_contributors/kalil-ventura.jpeg | Bin 0 -> 80126 bytes 3 files changed, 94 insertions(+), 57 deletions(-) create mode 100644 src/assets/img/top_contributors/flavio-landes.jpeg create mode 100644 src/assets/img/top_contributors/kalil-ventura.jpeg diff --git a/src/app/core/services/contributors/contributors.service.ts b/src/app/core/services/contributors/contributors.service.ts index d8f62434..6b5d0519 100644 --- a/src/app/core/services/contributors/contributors.service.ts +++ b/src/app/core/services/contributors/contributors.service.ts @@ -8,15 +8,20 @@ export class ContributorsService { name: 'Raffaello Damgaard', position: 'Product Owner', links: [ - { url: 'https://www.linkedin.com/in/raffacabofrio/', content: 'Linkedin' }, - { url: 'https://www.github.com/raffacabofrio/', content: 'Github' } - ] + { + url: 'https://www.linkedin.com/in/raffacabofrio/', + content: 'Linkedin', + }, + { url: 'https://www.github.com/raffacabofrio/', content: 'Github' }, + ], }, { image: 'assets/img/top_contributors/vagner.jpg', name: 'Vagner Nunes', position: 'Product Advisor', - links: [{ url: 'https://www.linkedin.com/in/vnunes/', content: 'Linkedin' }] + links: [ + { url: 'https://www.linkedin.com/in/vnunes/', content: 'Linkedin' }, + ], }, { image: 'assets/img/top_contributors/antero.jpg', @@ -24,17 +29,20 @@ export class ContributorsService { position: 'Leader Frontend Developer', links: [ { url: 'https://www.linkedin.com/in/wantero/', content: 'Linkedin' }, - { url: 'https://github.com/wantero', content: 'Github' } - ] + { url: 'https://github.com/wantero', content: 'Github' }, + ], }, { image: 'assets/img/top_contributors/max.jpg', name: 'Max Gomes', position: 'Leader Mobile Developer', links: [ - { url: 'https://www.linkedin.com/in/maxgomes92/', content: 'Linkedin' }, - { url: 'https://github.com/maxgomes92', content: 'Github' } - ] + { + url: 'https://www.linkedin.com/in/maxgomes92/', + content: 'Linkedin', + }, + { url: 'https://github.com/maxgomes92', content: 'Github' }, + ], }, { image: 'assets/img/top_contributors/daniel.jpg', @@ -42,106 +50,135 @@ export class ContributorsService { position: 'Backend Developer/ Architect', links: [ { - url: 'https://www.linkedin.com/in/daniel-alo%C3%ADsio-oliveira-da-silva-06242291/', - content: 'Linkedin' + url: + 'https://www.linkedin.com/in/daniel-alo%C3%ADsio-oliveira-da-silva-06242291/', + content: 'Linkedin', }, - { url: 'https://github.com/danielaloisio', content: 'Github' } - ] + { url: 'https://github.com/danielaloisio', content: 'Github' }, + ], }, { image: 'assets/img/top_contributors/walter.jpg', name: 'Walter Vinicius', position: 'Fullstack Developer', links: [ - { url: 'https://www.linkedin.com/in/walter-cardoso-aab682a8/', content: 'Linkedin' }, - { url: 'https://github.com/walter-lopes', content: 'Github' } - ] + { + url: 'https://www.linkedin.com/in/walter-cardoso-aab682a8/', + content: 'Linkedin', + }, + { url: 'https://github.com/walter-lopes', content: 'Github' }, + ], }, { image: 'assets/img/top_contributors/pedro_moreira.jpg', name: 'Pedro Moreira', position: 'Designer', - links: [{ url: 'https://www.linkedin.com/in/pedro-moreira-91369933/', content: 'Linkedin' }] + links: [ + { + url: 'https://www.linkedin.com/in/pedro-moreira-91369933/', + content: 'Linkedin', + }, + ], }, { image: 'assets/img/top_contributors/everton.jpg', name: 'Everton de Jesus', position: 'FrontEnd Developer', links: [ - { url: 'https://www.linkedin.com/in/everton-de-jesus-01295413b/', content: 'Linkedin' }, - { url: 'https://github.com/Everton1982', content: 'Github' } - ] + { + url: 'https://www.linkedin.com/in/everton-de-jesus-01295413b/', + content: 'Linkedin', + }, + { url: 'https://github.com/Everton1982', content: 'Github' }, + ], }, { image: 'assets/img/top_contributors/erisvaldo.jpg', name: 'Erisvaldo Correia', position: 'FrontEnd Developer', links: [ - { url: 'https://www.linkedin.com/in/erisvaldo-correia-46574850/', content: 'Linkedin' }, - { url: 'https://github.com/ErisvaldoCorreia', content: 'Github' } - ] + { + url: 'https://www.linkedin.com/in/erisvaldo-correia-46574850/', + content: 'Linkedin', + }, + { url: 'https://github.com/ErisvaldoCorreia', content: 'Github' }, + ], }, { image: 'assets/img/top_contributors/ratton.jpg', name: 'Marcelo Ratton', position: 'Technical Advisor', - links: [{ url: 'https://www.linkedin.com/in/rattones/', content: 'Linkedin' }] + links: [ + { url: 'https://www.linkedin.com/in/rattones/', content: 'Linkedin' }, + ], }, { image: 'assets/img/top_contributors/montanha.jpg', name: 'Roberto Montanha', position: 'Facilitador', - links: [{ url: 'https://www.linkedin.com/in/robertomontanha/', content: 'Linkedin' }] + links: [ + { + url: 'https://www.linkedin.com/in/robertomontanha/', + content: 'Linkedin', + }, + ], }, { image: 'assets/img/top_contributors/manoel-jr.jpg', name: 'Manoel Júnior', position: 'Facilitador', - links: [{ url: 'https://www.linkedin.com/in/msjunior/', content: 'Linkedin' }] + links: [ + { url: 'https://www.linkedin.com/in/msjunior/', content: 'Linkedin' }, + ], }, { - image: 'assets/img/top_contributors/davi-mattos.jpg', - name: 'Davi Mattos', - position: 'Leader UI/UX Designer', + image: 'assets/img/top_contributors/rodrigo-silva.jpg', + name: 'Rodrigo Silva', + position: 'Facilitador', links: [ - { url: 'https://www.linkedin.com/in/davimattosdev/', content: 'Linkedin' }, - { url: 'https://github.com/davimattos', content: 'Github' } - ] + { + url: 'https://www.linkedin.com/in/rodrigoesilva/', + content: 'Linkedin', + }, + ], }, { - image: 'assets/img/top_contributors/bruno-henn.jpg', - name: 'Bruno Henn', - position: 'Backend Developer', + image: 'assets/img/top_contributors/abraao.jpeg', + name: 'Abraão Allysson', + position: 'Fullstack Developer', links: [ - { url: 'https://www.linkedin.com/in/bruno-henn/', content: 'Linkedin' }, - { url: 'https://github.com/bhenn', content: 'Github' } - ] + { + url: 'https://www.linkedin.com/in/abraaohonorio/', + content: 'Linkedin', + }, + { url: 'https://github.com/AbraaoHonorio', content: 'Github' }, + ], }, { - image: 'assets/img/top_contributors/marcio-ferreira.jpg', - name: 'Marcio Ferreira', + image: 'assets/img/top_contributors/kalil-ventura.jpeg', + name: 'Kalil Ventura', position: 'Backend Developer', links: [ - { url: 'https://www.linkedin.com/in/marciojfsantos/', content: 'Linkedin' }, - { url: 'https://github.com/marcios', content: 'Github' } - ] - }, - { - image: 'assets/img/top_contributors/rodrigo-silva.jpg', - name: 'Rodrigo Silva', - position: 'Facilitador', - links: [{ url: 'https://www.linkedin.com/in/rodrigoesilva/', content: 'Linkedin' }, - ] + { + url: 'https://www.linkedin.com/in/kalilventura/', + content: 'Linkedin', + }, + { url: 'https://github.com/kalilventura', content: 'Github' }, + ], }, { - image: 'assets/img/top_contributors/abraao.jpeg', - name: 'Abraão Allysson', - position: 'Fullstack Developer', + image: 'assets/img/top_contributors/flavio-landes.jpeg', + name: 'Flávio Landes', + position: 'Backend Developer', links: [ - { url: 'https://www.linkedin.com/in/abraaohonorio/', content: 'Linkedin' }, - { url: 'https://github.com/AbraaoHonorio', content: 'Github' } - ] - } + { + url: + 'https://www.linkedin.com/in/fl%C3%A1vio-barreiro-landes-5a0231157/', + content: 'Linkedin', + }, + { url: 'https://github.com/FlavioLandes', content: 'Github' }, + ], + }, ]; return contributors; diff --git a/src/assets/img/top_contributors/flavio-landes.jpeg b/src/assets/img/top_contributors/flavio-landes.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..3c57bd75a9c698326dea481cb3ca73cbf42c6d04 GIT binary patch literal 59157 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 ~biESY?X?-0%k; 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 SnXV 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�f~|PG^t98joaw?pySd{{RhY(`L!w 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

gpaAylVv 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 literal 0 HcmV?d00001 From 6b3d2a2859514aa731fcf1b178dea84624abe95a Mon Sep 17 00:00:00 2001 From: Raffaello Damgaard Date: Sun, 31 May 2020 21:03:54 -0300 Subject: [PATCH 12/34] Novos status de livro. --- src/app/core/models/BookDonationStatus.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/app/core/models/BookDonationStatus.ts b/src/app/core/models/BookDonationStatus.ts index 65fd59b4..d286fc80 100644 --- a/src/app/core/models/BookDonationStatus.ts +++ b/src/app/core/models/BookDonationStatus.ts @@ -1,8 +1,9 @@ export enum BookDonationStatus { - UNKNOW = 'Não identificado', WAITING_APPROVAL = 'Aguardando aprovação', AVAILABLE = 'Disponível', - INVISIBLE = 'Invisível', - DONATED = 'Doado', - CANCELED = 'Cancelado' + WAITING_DECISION = 'Aguardando decisão do doador', + WAITING_SEND = 'Aguardando envio', + SENT = 'Enviado', + RECEIVED = 'Recebido', + CANCELED = 'Cancelado', } From a08178a49759380866625bff5dd1716ba1f44c7f Mon Sep 17 00:00:00 2001 From: Raffaello Damgaard Date: Tue, 2 Jun 2020 14:58:58 -0300 Subject: [PATCH 13/34] Novo campo status no model. --- src/app/core/models/book.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/core/models/book.ts b/src/app/core/models/book.ts index 96d71024..b24e841e 100644 --- a/src/app/core/models/book.ts +++ b/src/app/core/models/book.ts @@ -1,5 +1,6 @@ import { Category } from './category'; import { User } from './user'; +import { BookDonationStatus } from './BookDonationStatus'; export class Book { title: string; @@ -14,12 +15,11 @@ export class Book { userIdFacilitator: string; userFacilitator: User; category: Category; - approved: boolean; - // bookUsers imageUrl: string; imageName: string; chooseDate: Date; synopsis: string; id: string; creationDate: Date; + status: BookDonationStatus; } From eb95030a41e51864e9c760b6450260eea1f9d67f Mon Sep 17 00:00:00 2001 From: Raffaello Damgaard Date: Tue, 2 Jun 2020 16:01:06 -0300 Subject: [PATCH 14/34] =?UTF-8?q?Campo=20=C3=BAnico=20de=20status?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/details/details.component.ts | 195 +++++++++-------- .../book/donations/donations.component.ts | 137 +++++++----- .../components/book/form/form.component.ts | 204 +++++++++--------- 3 files changed, 289 insertions(+), 247 deletions(-) diff --git a/src/app/components/book/details/details.component.ts b/src/app/components/book/details/details.component.ts index 46e75dde..1c9a7f4b 100644 --- a/src/app/components/book/details/details.component.ts +++ b/src/app/components/book/details/details.component.ts @@ -18,7 +18,7 @@ import { SeoService } from '../../../core/services/seo/seo.service'; @Component({ selector: 'app-details', templateUrl: './details.component.html', - styleUrls: ['./details.component.css'] + styleUrls: ['./details.component.css'], }) export class DetailsComponent implements OnInit, OnDestroy { freightOptions: FreightOptions[] = []; @@ -65,102 +65,113 @@ export class DetailsComponent implements OnInit, OnDestroy { } getMyUser() { - this._scUser.getUserData() - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe(x => { - this.myUser = x; - this.getBook(); - }); + this._scUser + .getUserData() + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe((x) => { + this.myUser = x; + this.getBook(); + }); } getBook() { let slug = ''; this._activatedRoute.params - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe(param => (slug = param.slug)); + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe((param) => (slug = param.slug)); if (slug) { - this._scBook.getBySlug(slug) - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe( - x => { - this._scBook.getFreightOptions() - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe(data => { - this.freightOptions = data; - - const name = this.freightOptions.find(obj => obj.value.toString() === x.freightOption.toString()); - this.freightName = name.text; - - this.bookInfo = x; - this.pageTitle = this.bookInfo.title; - this.available = this.bookInfo.approved; - const chooseDate = Math.floor(new Date(this.bookInfo.chooseDate).getTime() / (3600 * 24 * 1000)); - const todayDate = Math.floor(new Date().getTime() / (3600 * 24 * 1000)); - - this.daysToChoose = chooseDate - todayDate; - this.chooseDateInfo = - !this.daysToChoose || this.daysToChoose <= 0 ? 'Hoje' : 'Daqui a ' + this.daysToChoose + ' dia(s)'; - - if (this.myUser.name) { - switch (x.freightOption.toString()) { - case 'City': { - if (this.bookInfo.user.address.city !== this.myUser.address.city) { - this.isFreeFreight = false; + this._scBook + .getBySlug(slug) + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe( + (x) => { + this._scBook + .getFreightOptions() + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe((data) => { + this.freightOptions = data; + + const name = this.freightOptions.find( + (obj) => obj.value.toString() === x.freightOption.toString() + ); + this.freightName = name.text; + + this.bookInfo = x; + this.pageTitle = this.bookInfo.title; + //this.available = this.bookInfo.approved; + // TODO: verificar o status corretamente. + this.available = true; + const chooseDate = Math.floor( + new Date(this.bookInfo.chooseDate).getTime() / + (3600 * 24 * 1000) + ); + const todayDate = Math.floor( + new Date().getTime() / (3600 * 24 * 1000) + ); + + this.daysToChoose = chooseDate - todayDate; + this.chooseDateInfo = + !this.daysToChoose || this.daysToChoose <= 0 + ? 'Hoje' + : 'Daqui a ' + this.daysToChoose + ' dia(s)'; + + if (this.myUser.name) { + switch (x.freightOption.toString()) { + case 'City': { + if ( + this.bookInfo.user.address.city !== + this.myUser.address.city + ) { + this.isFreeFreight = false; + } + break; + } + case 'State': { + if ( + this.bookInfo.user.address.state !== + this.myUser.address.state + ) { + this.isFreeFreight = false; + } + break; + } + case 'WithoutFreight': { + this.isFreeFreight = false; + break; + } + default: { + this.isFreeFreight = true; + } } - break; - } - case 'State': { - if (this.bookInfo.user.address.state !== this.myUser.address.state) { - this.isFreeFreight = false; - } - break; - } - case 'WithoutFreight': { - this.isFreeFreight = false; - break; } - default: { - this.isFreeFreight = true; + + if (this.userProfile) { + this._scBook + .getRequested(x.id) + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe((requested) => { + this.requested = requested.value.bookRequested; + this.state = 'ready'; + }); + } else { + this.state = 'ready'; } - } - } - - if (this.userProfile) { - this._scBook.getRequested(x.id) - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe(requested => { - this.requested = requested.value.bookRequested; - this.state = 'ready'; + + this._seo.generateTags({ + title: this.bookInfo.title, + description: this.bookInfo.synopsis, + image: this.bookInfo.imageUrl, + slug: slug, + }); }); - } else { - this.state = 'ready'; - } - - this._seo.generateTags({ - title: this.bookInfo.title, - description: this.bookInfo.synopsis, - image: this.bookInfo.imageUrl, - slug: slug - }); - }); - }, - err => { - console.error(err); - this.pageTitle = 'Ops... Não encontramos esse livro :/'; - this.state = 'not-found'; - } - ); + }, + (err) => { + console.error(err); + this.pageTitle = 'Ops... Não encontramos esse livro :/'; + this.state = 'not-found'; + } + ); } else { this.pageTitle = 'Ops... Não encontramos esse livro :/'; this.state = 'not-found'; @@ -170,16 +181,16 @@ export class DetailsComponent implements OnInit, OnDestroy { onRequestBook() { const modalRef = this._modalService.open(RequestComponent, { backdropClass: 'light-blue-backdrop', - centered: true + centered: true, }); modalRef.result.then( - result => { + (result) => { if (result === 'Success') { this.requested = true; } }, - reason => { + (reason) => { if (reason === 'Success') { this.requested = true; } @@ -190,7 +201,9 @@ export class DetailsComponent implements OnInit, OnDestroy { } onLoginBook() { - this._router.navigate(['/login'], { queryParams: { returnUrl: this._activatedRoute.snapshot.url.join('/') } }); + this._router.navigate(['/login'], { + queryParams: { returnUrl: this._activatedRoute.snapshot.url.join('/') }, + }); } onConvertImageToBase64(event: any) { @@ -199,7 +212,7 @@ export class DetailsComponent implements OnInit, OnDestroy { reader.readAsDataURL(event.target.files[0]); // tslint:disable-next-line:no-shadowed-variable - reader.onload = event => { + reader.onload = (event) => { const img = event.target['result'].split(','); this.bookInfo.imageBytes = img[1]; }; diff --git a/src/app/components/book/donations/donations.component.ts b/src/app/components/book/donations/donations.component.ts index 01d2979b..d5740d42 100644 --- a/src/app/components/book/donations/donations.component.ts +++ b/src/app/components/book/donations/donations.component.ts @@ -16,7 +16,7 @@ import { ToastrService } from 'ngx-toastr'; @Component({ selector: 'app-donations', templateUrl: './donations.component.html', - styleUrls: ['./donations.component.css'] + styleUrls: ['./donations.component.css'], }) export class DonationsComponent implements OnInit, OnDestroy { donatedBooks = new Array(); @@ -40,8 +40,11 @@ export class DonationsComponent implements OnInit, OnDestroy { // Carrega Status do ENUM BookDonationStatus const myBookDonationStatus = new Array(); - Object.keys(BookDonationStatus).forEach(key => { - myBookDonationStatus.push({ value: BookDonationStatus[key], title: BookDonationStatus[key] }); + Object.keys(BookDonationStatus).forEach((key) => { + myBookDonationStatus.push({ + value: BookDonationStatus[key], + title: BookDonationStatus[key], + }); }); const btnDonate = @@ -58,15 +61,15 @@ export class DonationsComponent implements OnInit, OnDestroy { columns: { title: { title: 'Titulo', - width: '27%' + width: '27%', }, totalInterested: { title: 'Total interessados', - width: '08%' + width: '08%', }, daysInShowcase: { title: 'Dias na vitrine', - width: '08%' + width: '08%', }, chooseDate: { title: 'Data Escolha', @@ -74,29 +77,31 @@ export class DonationsComponent implements OnInit, OnDestroy { type: 'html', valuePrepareFunction: (cell, row) => { return new DatePipe('en-US').transform(cell, 'dd/MM/yyyy'); - } + }, }, trackingNumber: { title: 'Código Ratreio', - width: '15%' + width: '15%', }, status: { title: 'Status', width: '15%', type: 'html', - valuePrepareFunction: value => { + valuePrepareFunction: (value) => { return this._sanitizer.bypassSecurityTrustHtml( - `${value}` + `${value}` ); }, filter: { type: 'list', config: { selectText: 'Selecionar...', - list: myBookDonationStatus - } - } - } + list: myBookDonationStatus, + }, + }, + }, }, actions: { delete: false, @@ -106,102 +111,116 @@ export class DonationsComponent implements OnInit, OnDestroy { custom: [ { name: 'donate', - title: btnDonate + title: btnDonate, }, { name: 'renewChooseDate', - title: btnRenewChooseDate + title: btnRenewChooseDate, }, { name: 'trackNumber', - title: btnTrackNumber - } + title: btnTrackNumber, + }, ], - position: 'right' // left|right + position: 'right', // left|right }, attr: { - class: 'table table-bordered table-hover table-striped' + class: 'table table-bordered table-hover table-striped', }, - noDataMessage: 'Nenhum registro encontrado.' + noDataMessage: 'Nenhum registro encontrado.', }; } private getStatusBadge(status) { switch (status) { - case BookDonationStatus.UNKNOW: - return 'secondary'; case BookDonationStatus.WAITING_APPROVAL: + case BookDonationStatus.WAITING_DECISION: + case BookDonationStatus.WAITING_SEND: return 'warning'; case BookDonationStatus.AVAILABLE: - return 'primary'; - case BookDonationStatus.INVISIBLE: - return 'light'; - case BookDonationStatus.DONATED: + case BookDonationStatus.RECEIVED: + case BookDonationStatus.SENT: return 'success'; case BookDonationStatus.CANCELED: return 'danger'; + default: + return 'secondary'; } } getDonations() { this.isLoading = true; - this._bookService.getDonatedBooks() - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe(resp => { - this.donatedBooks = resp; - this.isLoading = false; - }); + this._bookService + .getDonatedBooks() + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe((resp) => { + this.donatedBooks = resp; + this.isLoading = false; + }); } onCustom(event) { switch (event.action) { case 'donate': { - if (event.data.donated || event.data.status === BookDonationStatus.CANCELED) { + if ( + event.data.donated || + event.data.status === BookDonationStatus.CANCELED + ) { alert('Livro já doado ou cancelado!'); } else { - const chooseDate = Math.floor(new Date(event.data.chooseDate).getTime() / (3600 * 24 * 1000)); - const todayDate = Math.floor(new Date().getTime() / (3600 * 24 * 1000)); + const chooseDate = Math.floor( + new Date(event.data.chooseDate).getTime() / (3600 * 24 * 1000) + ); + const todayDate = Math.floor( + new Date().getTime() / (3600 * 24 * 1000) + ); if (!chooseDate || chooseDate - todayDate > 0) { alert('Aguarde a data de escolha!'); } else { this._router.navigate([`book/donate/${event.data.id}`], { - queryParams: { returnUrl: this._activatedRoute.snapshot.url.join('/') } + queryParams: { + returnUrl: this._activatedRoute.snapshot.url.join('/'), + }, }); } } break; } case 'renewChooseDate': { - if (event.data.donated || event.data.status === BookDonationStatus.CANCELED) { + if ( + event.data.donated || + event.data.status === BookDonationStatus.CANCELED + ) { alert('Livro já doado ou cancelado!'); } else { - const chooseDate = Math.floor(new Date(event.data.chooseDate).getTime() / (3600 * 24 * 1000)); - const todayDate = Math.floor(new Date().getTime() / (3600 * 24 * 1000)); + const chooseDate = Math.floor( + new Date(event.data.chooseDate).getTime() / (3600 * 24 * 1000) + ); + const todayDate = Math.floor( + new Date().getTime() / (3600 * 24 * 1000) + ); if (!chooseDate || chooseDate - todayDate > 0) { alert('Aguarde a data de escolha!'); } else { this._confirmationDialogService .confirm('Atenção!', 'Confirma a renovação da data de doação?') - .then(confirmed => { + .then((confirmed) => { if (confirmed) { - this._bookService.renewChooseDate(event.data.id) - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe( - () => { - this._toastr.success('Doação renovada com sucesso.'); - this.getDonations(); - }, - error => { - this._toastr.error(error); - } - ); + this._bookService + .renewChooseDate(event.data.id) + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe( + () => { + this._toastr.success('Doação renovada com sucesso.'); + this.getDonations(); + }, + (error) => { + this._toastr.error(error); + } + ); } }); } @@ -214,16 +233,16 @@ export class DonationsComponent implements OnInit, OnDestroy { } else { const modalRef = this._modalService.open(TrackingComponent, { backdropClass: 'light-blue-backdrop', - centered: true + centered: true, }); modalRef.result.then( - result => { + (result) => { if (result === 'Success') { this.getDonations(); } }, - reason => { + (reason) => { if (reason === 'Success') { this.getDonations(); } diff --git a/src/app/components/book/form/form.component.ts b/src/app/components/book/form/form.component.ts index 338a8803..b63f946a 100644 --- a/src/app/components/book/form/form.component.ts +++ b/src/app/components/book/form/form.component.ts @@ -19,7 +19,7 @@ import { SeoService } from '../../../core/services/seo/seo.service'; @Component({ selector: 'app-form', templateUrl: './form.component.html', - styleUrls: ['./form.component.css'] + styleUrls: ['./form.component.css'], }) export class FormComponent implements OnInit, OnDestroy { formGroup: FormGroup; @@ -65,7 +65,7 @@ export class FormComponent implements OnInit, OnDestroy { 'Vc não faz ideia de como tem pessoas que realmente precisam. ' + 'E da força transformadora que um simples livro causa na vida de uma pessoa. ' + 'E que você ao escolher um ganhador, passa a fazer parte dessa história.', - slug: 'doar-livro' + slug: 'doar-livro', }); this.findProfile(); @@ -74,24 +74,36 @@ export class FormComponent implements OnInit, OnDestroy { this.shareBookUser = this._scUser.getLoggedUserFromLocalStorage(); } - this._scBook.getFreightOptions() - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe(data => (this.freightOptions = data)); + this._scBook + .getFreightOptions() + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe((data) => (this.freightOptions = data)); - this._scCategory.getAll() - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe(data => (this.categories = data)); + this._scCategory + .getAll() + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe((data) => (this.categories = data)); } createFormGroup() { this.formGroup = this._formBuilder.group({ id: '', - title: ['', [Validators.required, Validators.minLength(3), Validators.maxLength(200)]], - author: ['', [Validators.required, Validators.minLength(3), Validators.maxLength(200)]], + title: [ + '', + [ + Validators.required, + Validators.minLength(3), + Validators.maxLength(200), + ], + ], + author: [ + '', + [ + Validators.required, + Validators.minLength(3), + Validators.maxLength(200), + ], + ], categoryId: ['', [Validators.required]], userIdFacilitator: [''], userId: ['', [Validators.required]], @@ -102,21 +114,20 @@ export class FormComponent implements OnInit, OnDestroy { imageUrl: '', imageSlug: '', synopsis: ['', [Validators.maxLength(2000)]], - agreeToTerms: ['', Validators.requiredTrue ] + agreeToTerms: ['', Validators.requiredTrue], }); } findProfile() { - this._scUser.getProfile() - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe(({ profile }) => { - this.userProfile = profile; - this.createFormGroup(); - this.getBookSaved(); - this.buildFormsLabels(); - }); + this._scUser + .getProfile() + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe(({ profile }) => { + this.userProfile = profile; + this.createFormGroup(); + this.getBookSaved(); + this.buildFormsLabels(); + }); } buildFormsLabels() { @@ -132,38 +143,39 @@ export class FormComponent implements OnInit, OnDestroy { getBookSaved() { let id = ''; this._activatedRoute.params - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe(param => (id = param.id)); + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe((param) => (id = param.id)); this.itsEditMode = !!id; if (this.userProfile === 'Administrator' && id) { - this._scBook.getById(id) - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe(x => { - const bookForUpdate = { - id: x.id, - title: x.title, - author: x.author, - categoryId: x.categoryId, - userIdFacilitator: !!x.userIdFacilitator ? x.userIdFacilitator : null, - userId: x.userId, - freightOption: x.freightOption, - imageBytes: '', - imageName: null, - approved: x.approved, - imageUrl: x.imageUrl, - imageSlug: x.imageSlug, - synopsis: !!x.synopsis ? x.synopsis : '', - agreeToTerms: true - }; - this.formGroup.get('userIdFacilitator').setValidators([Validators.required]); // Facilitador obrigatório para edição do admin - this.formGroup.setValue(bookForUpdate); - this.getAllFacilitators(); - }); + this._scBook + .getById(id) + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe((x) => { + const bookForUpdate = { + id: x.id, + title: x.title, + author: x.author, + categoryId: x.categoryId, + userIdFacilitator: !!x.userIdFacilitator + ? x.userIdFacilitator + : null, + userId: x.userId, + freightOption: x.freightOption, + imageBytes: '', + imageName: null, + status: x.status, + imageUrl: x.imageUrl, + imageSlug: x.imageSlug, + synopsis: !!x.synopsis ? x.synopsis : '', + agreeToTerms: true, + }; + this.formGroup + .get('userIdFacilitator') + .setValidators([Validators.required]); // Facilitador obrigatório para edição do admin + this.formGroup.setValue(bookForUpdate); + this.getAllFacilitators(); + }); } // ao doar um livro, o userId é do usuário logado. @@ -185,30 +197,28 @@ export class FormComponent implements OnInit, OnDestroy { this.formGroup.value.imageName = 'iPhone-image.jpg'; // Para iphone o mesmo não envia o nome da imagem } - this._scBook.create(this.formGroup.value) - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe(resp => { - if (resp.success) { - this.isSaved = true; - this._toastr.success('Livro cadastrado com sucesso!'); - this.pageTitle = 'Obrigado por ajudar.'; - } else { - this._toastr.error(resp.messages[0]); - } - this.isLoading = false; - }); + this._scBook + .create(this.formGroup.value) + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe((resp) => { + if (resp.success) { + this.isSaved = true; + this._toastr.success('Livro cadastrado com sucesso!'); + this.pageTitle = 'Obrigado por ajudar.'; + } else { + this._toastr.error(resp.messages[0]); + } + this.isLoading = false; + }); } else { - this._scBook.update(this.formGroup.value) - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe(resp => { - this.isSaved = true; - this.pageTitle = 'Registro atualizado'; - this.isLoading = false; - }); + this._scBook + .update(this.formGroup.value) + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe((resp) => { + this.isSaved = true; + this.pageTitle = 'Registro atualizado'; + this.isLoading = false; + }); } } } @@ -234,34 +244,34 @@ export class FormComponent implements OnInit, OnDestroy { this.isLoadingMessage = 'Processando imagem...'; this.isImageLoaded = true; - this._ng2ImgMaxService.resize([imageResult.file], 600, 10000) - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe(result => { - const reader = new FileReader(); - reader.readAsDataURL(result); + this._ng2ImgMaxService + .resize([imageResult.file], 600, 10000) + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe((result) => { + const reader = new FileReader(); + reader.readAsDataURL(result); - reader.onload = event => { - this.src = reader.result; - const img = this.src.split(','); - this.formGroup.controls['imageBytes'].setValue(img[1]); - this.isLoading = false; - }; - }); + reader.onload = (event) => { + this.src = reader.result; + const img = this.src.split(','); + this.formGroup.controls['imageBytes'].setValue(img[1]); + this.isLoading = false; + }; + }); } else { - this.formGroup.controls['imageName'].setErrors({ InvalidExtension: true }); + this.formGroup.controls['imageName'].setErrors({ + InvalidExtension: true, + }); this.formGroup.controls['imageBytes'].setValue(''); this.isImageLoaded = false; } } getAllFacilitators() { - this._scUser.getAllFacilitators(this.formGroup.get('userId').value) - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe(data => (this.facilitators = data)); + this._scUser + .getAllFacilitators(this.formGroup.get('userId').value) + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe((data) => (this.facilitators = data)); } ngOnDestroy() { From 94c06a284c10f4db00e550e8d0abef22cc6f4b48 Mon Sep 17 00:00:00 2001 From: Raffaello Damgaard Date: Tue, 2 Jun 2020 20:13:52 -0300 Subject: [PATCH 15/34] Fix moment-timezone import. --- package-lock.json | 12 +++---- package.json | 2 +- .../authentication/authentication.service.ts | 32 ++++++++++++------- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 84e723cf..a8a7a214 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6535,14 +6535,14 @@ } }, "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz", + "integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw==" }, "moment-timezone": { - "version": "0.5.27", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.27.tgz", - "integrity": "sha512-EIKQs7h5sAsjhPCqN6ggx6cEbs94GK050254TIJySD1bzoM5JTYDwAU1IoVOeTOL6Gm27kYJ51/uuvq1kIlrbw==", + "version": "0.5.31", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz", + "integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==", "requires": { "moment": ">= 2.9.0" } diff --git a/package.json b/package.json index 1971fdfc..a6fa5e23 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "@ng-bootstrap/ng-bootstrap": "^4.1.1", "base64-img": "^1.0.4", "core-js": "^2.5.4", - "moment-timezone": "^0.5.21", + "moment-timezone": "^0.5.31", "ng-recaptcha": "^3.0.5", "ng2-completer": "^2.0.8", "ng2-imageupload": "^1.4.2", diff --git a/src/app/core/services/authentication/authentication.service.ts b/src/app/core/services/authentication/authentication.service.ts index 70571f44..8469df45 100644 --- a/src/app/core/services/authentication/authentication.service.ts +++ b/src/app/core/services/authentication/authentication.service.ts @@ -2,7 +2,7 @@ import { HttpClient } from '@angular/common/http'; import { map } from 'rxjs/operators'; import { Router } from '@angular/router'; -import moment from 'moment-timezone'; +import * as moment from 'moment-timezone'; import { UserService } from '../user/user.service'; @@ -19,18 +19,26 @@ export class AuthenticationService { private _localStorageUserKey = 'shareBookUser'; login(email: string, password: string) { - return this.http.post(`${this.config.apiEndpoint}/Account/Login/`, { email: email, password: password }).pipe( - map(response => { - // login successful if there's a jwt token in the response - if (response.success || response.value.authenticated) { - // store user details and jwt token in local storage to keep user logged in between page refreshes - localStorage.setItem('shareBookUser', JSON.stringify(response.value)); - this._user.setLoggedUser(response.value); - } - - return response.value; + return this.http + .post(`${this.config.apiEndpoint}/Account/Login/`, { + email: email, + password: password, }) - ); + .pipe( + map((response) => { + // login successful if there's a jwt token in the response + if (response.success || response.value.authenticated) { + // store user details and jwt token in local storage to keep user logged in between page refreshes + localStorage.setItem( + 'shareBookUser', + JSON.stringify(response.value) + ); + this._user.setLoggedUser(response.value); + } + + return response.value; + }) + ); } logout() { From ad88f761967d14297d1aa6ed6418ca33b3a885bb Mon Sep 17 00:00:00 2001 From: Raffaello Damgaard Date: Wed, 3 Jun 2020 22:26:47 -0300 Subject: [PATCH 16/34] =?UTF-8?q?Status=20=C3=BAnico.=20Livro=20por=20slug?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/details/details.component.html | 58 ++++++++++++++----- .../book/details/details.component.ts | 36 +++++------- 2 files changed, 59 insertions(+), 35 deletions(-) diff --git a/src/app/components/book/details/details.component.html b/src/app/components/book/details/details.component.html index 70a06166..5b4631c5 100644 --- a/src/app/components/book/details/details.component.html +++ b/src/app/components/book/details/details.component.html @@ -2,12 +2,18 @@

{{ pageTitle }}

-
Aguarde...
+
+ Aguarde... +
@@ -26,15 +32,35 @@

{{ pageTitle }}

Título:
{{ bookInfo.title }}

Autor:
{{ bookInfo.author }}

-

Categoria:
{{ bookInfo.category?.name }}

-

Sinópse:
{{ bookInfo.synopsis }}

-

Quando será anunciado o ganhador desse livro?
{{ chooseDateInfo }}

-

Local de Origem
{{ bookInfo.user.address.city }} - {{ bookInfo.user.address.state }}

-

Frete grátis?
{{ isFreeFreight ? 'Sim' : 'Não' }}

-
- +

Categoria:
{{ bookInfo.category }}

+

+ Sinópse:
{{ bookInfo.synopsis }} +

+

+ Quando será anunciado o ganhador desse livro?
{{ + chooseDateInfo + }} +

+

+ Local de Origem
{{ bookInfo.city }} - + {{ bookInfo.state }} +

+

+ Frete grátis?
{{ isFreeFreight ? 'Sim' : 'Não' }} +

+
+ Estou ciente que o frete não é grátis. Caso seja escolhido, me + comprometo a reembolsar o doador.
@@ -42,9 +68,13 @@

{{ pageTitle }}

diff --git a/src/app/components/book/details/details.component.ts b/src/app/components/book/details/details.component.ts index 1c9a7f4b..02e03e9b 100644 --- a/src/app/components/book/details/details.component.ts +++ b/src/app/components/book/details/details.component.ts @@ -14,6 +14,7 @@ import { RequestComponent } from '../request/request.component'; import { AuthenticationService } from 'src/app/core/services/authentication/authentication.service'; import { UserInfo } from 'src/app/core/models/userInfo'; import { SeoService } from '../../../core/services/seo/seo.service'; +import { BookDonationStatus } from 'src/app/core/models/BookDonationStatus'; @Component({ selector: 'app-details', @@ -85,23 +86,20 @@ export class DetailsComponent implements OnInit, OnDestroy { .getBySlug(slug) .pipe(takeUntil(this._destroySubscribes$)) .subscribe( - (x) => { + (book) => { this._scBook .getFreightOptions() .pipe(takeUntil(this._destroySubscribes$)) .subscribe((data) => { this.freightOptions = data; - const name = this.freightOptions.find( - (obj) => obj.value.toString() === x.freightOption.toString() - ); - this.freightName = name.text; + this.freightName = book.freightOption; - this.bookInfo = x; + this.bookInfo = book; this.pageTitle = this.bookInfo.title; - //this.available = this.bookInfo.approved; - // TODO: verificar o status corretamente. - this.available = true; + this.available = + this.bookInfo.status == BookDonationStatus.AVAILABLE; + const chooseDate = Math.floor( new Date(this.bookInfo.chooseDate).getTime() / (3600 * 24 * 1000) @@ -117,26 +115,20 @@ export class DetailsComponent implements OnInit, OnDestroy { : 'Daqui a ' + this.daysToChoose + ' dia(s)'; if (this.myUser.name) { - switch (x.freightOption.toString()) { - case 'City': { - if ( - this.bookInfo.user.address.city !== - this.myUser.address.city - ) { + switch (book.freightOption) { + case 'Cidade': { + if (book.city !== this.myUser.address.city) { this.isFreeFreight = false; } break; } - case 'State': { - if ( - this.bookInfo.user.address.state !== - this.myUser.address.state - ) { + case 'Estado': { + if (book.state !== this.myUser.address.state) { this.isFreeFreight = false; } break; } - case 'WithoutFreight': { + case 'Não': { this.isFreeFreight = false; break; } @@ -148,7 +140,7 @@ export class DetailsComponent implements OnInit, OnDestroy { if (this.userProfile) { this._scBook - .getRequested(x.id) + .getRequested(book.id) .pipe(takeUntil(this._destroySubscribes$)) .subscribe((requested) => { this.requested = requested.value.bookRequested; From 585279faa0c1b6de41f879e44b3527accc930bee Mon Sep 17 00:00:00 2001 From: Raffaello Damgaard Date: Wed, 3 Jun 2020 22:27:35 -0300 Subject: [PATCH 17/34] Lint fix. --- src/app/components/book/details/details.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/components/book/details/details.component.ts b/src/app/components/book/details/details.component.ts index 02e03e9b..38d435d6 100644 --- a/src/app/components/book/details/details.component.ts +++ b/src/app/components/book/details/details.component.ts @@ -98,7 +98,7 @@ export class DetailsComponent implements OnInit, OnDestroy { this.bookInfo = book; this.pageTitle = this.bookInfo.title; this.available = - this.bookInfo.status == BookDonationStatus.AVAILABLE; + this.bookInfo.status === BookDonationStatus.AVAILABLE; const chooseDate = Math.floor( new Date(this.bookInfo.chooseDate).getTime() / From c7ec3b45d153a49718522596be2a36c442d3b6cf Mon Sep 17 00:00:00 2001 From: Raffaello Damgaard Date: Wed, 3 Jun 2020 22:32:43 -0300 Subject: [PATCH 18/34] =?UTF-8?q?Status=20=C3=BAnico.=20Minhas=20doa=C3=A7?= =?UTF-8?q?=C3=B5es.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/donations/donations.component.ts | 161 +++++++++--------- 1 file changed, 84 insertions(+), 77 deletions(-) diff --git a/src/app/components/book/donations/donations.component.ts b/src/app/components/book/donations/donations.component.ts index d5740d42..56d6bebf 100644 --- a/src/app/components/book/donations/donations.component.ts +++ b/src/app/components/book/donations/donations.component.ts @@ -136,10 +136,10 @@ export class DonationsComponent implements OnInit, OnDestroy { case BookDonationStatus.WAITING_APPROVAL: case BookDonationStatus.WAITING_DECISION: case BookDonationStatus.WAITING_SEND: + case BookDonationStatus.SENT: return 'warning'; case BookDonationStatus.AVAILABLE: case BookDonationStatus.RECEIVED: - case BookDonationStatus.SENT: return 'success'; case BookDonationStatus.CANCELED: return 'danger'; @@ -163,97 +163,104 @@ export class DonationsComponent implements OnInit, OnDestroy { onCustom(event) { switch (event.action) { case 'donate': { - if ( - event.data.donated || - event.data.status === BookDonationStatus.CANCELED - ) { - alert('Livro já doado ou cancelado!'); - } else { - const chooseDate = Math.floor( - new Date(event.data.chooseDate).getTime() / (3600 * 24 * 1000) - ); - const todayDate = Math.floor( - new Date().getTime() / (3600 * 24 * 1000) + if (event.data.status !== BookDonationStatus.WAITING_DECISION) { + alert( + `Não é possível escolher ganhador. \nstatus requerido = ${BookDonationStatus.WAITING_DECISION}\n` + + `status atual = ${event.data.status}` ); + return; + } - if (!chooseDate || chooseDate - todayDate > 0) { - alert('Aguarde a data de escolha!'); - } else { - this._router.navigate([`book/donate/${event.data.id}`], { - queryParams: { - returnUrl: this._activatedRoute.snapshot.url.join('/'), - }, - }); - } + const chooseDate = Math.floor( + new Date(event.data.chooseDate).getTime() / (3600 * 24 * 1000) + ); + const todayDate = Math.floor(new Date().getTime() / (3600 * 24 * 1000)); + + if (!chooseDate || chooseDate - todayDate > 0) { + alert('Aguarde a data de escolha!'); + } else { + this._router.navigate([`book/donate/${event.data.id}`], { + queryParams: { + returnUrl: this._activatedRoute.snapshot.url.join('/'), + }, + }); } + break; } case 'renewChooseDate': { - if ( - event.data.donated || - event.data.status === BookDonationStatus.CANCELED - ) { - alert('Livro já doado ou cancelado!'); - } else { - const chooseDate = Math.floor( - new Date(event.data.chooseDate).getTime() / (3600 * 24 * 1000) - ); - const todayDate = Math.floor( - new Date().getTime() / (3600 * 24 * 1000) + if (event.data.status !== BookDonationStatus.WAITING_DECISION) { + alert( + `Não é possível renovar doação. \nstatus requerido = ${BookDonationStatus.WAITING_DECISION}\n` + + `status atual = ${event.data.status}` ); + return; + } - if (!chooseDate || chooseDate - todayDate > 0) { - alert('Aguarde a data de escolha!'); - } else { - this._confirmationDialogService - .confirm('Atenção!', 'Confirma a renovação da data de doação?') - .then((confirmed) => { - if (confirmed) { - this._bookService - .renewChooseDate(event.data.id) - .pipe(takeUntil(this._destroySubscribes$)) - .subscribe( - () => { - this._toastr.success('Doação renovada com sucesso.'); - this.getDonations(); - }, - (error) => { - this._toastr.error(error); - } - ); - } - }); - } + const chooseDate = Math.floor( + new Date(event.data.chooseDate).getTime() / (3600 * 24 * 1000) + ); + const todayDate = Math.floor(new Date().getTime() / (3600 * 24 * 1000)); + + if (!chooseDate || chooseDate - todayDate > 0) { + alert('Aguarde a data de escolha!'); + } else { + this._confirmationDialogService + .confirm('Atenção!', 'Confirma a renovação da data de doação?') + .then((confirmed) => { + if (confirmed) { + this._bookService + .renewChooseDate(event.data.id) + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe( + () => { + this._toastr.success('Doação renovada com sucesso.'); + this.getDonations(); + }, + (error) => { + this._toastr.error(error); + } + ); + } + }); } + break; } case 'trackNumber': { - if (!event.data.donated) { - alert('Livro deve estar como doado!'); - } else { - const modalRef = this._modalService.open(TrackingComponent, { - backdropClass: 'light-blue-backdrop', - centered: true, - }); + if ( + event.data.status !== BookDonationStatus.WAITING_SEND && + event.data.status !== BookDonationStatus.SENT + ) { + alert( + `Não é possível informar código de rastreio. \nstatus requerido = ${BookDonationStatus.WAITING_SEND} ` + + `ou ${BookDonationStatus.SENT}\nstatus atual = ${event.data.status}` + ); + return; + } - modalRef.result.then( - (result) => { - if (result === 'Success') { - this.getDonations(); - } - }, - (reason) => { - if (reason === 'Success') { - this.getDonations(); - } + const modalRef = this._modalService.open(TrackingComponent, { + backdropClass: 'light-blue-backdrop', + centered: true, + }); + + modalRef.result.then( + (result) => { + if (result === 'Success') { + this.getDonations(); } - ); + }, + (reason) => { + if (reason === 'Success') { + this.getDonations(); + } + } + ); - modalRef.componentInstance.bookId = event.data.id; - modalRef.componentInstance.bookTitle = event.data.title; - modalRef.componentInstance.trackingNumber = event.data.trackingNumber; - break; - } + modalRef.componentInstance.bookId = event.data.id; + modalRef.componentInstance.bookTitle = event.data.title; + modalRef.componentInstance.trackingNumber = event.data.trackingNumber; + break; } } } From a50e70fb96f69eab8ae78eecb98ae01bf477288e Mon Sep 17 00:00:00 2001 From: Raffaello Damgaard Date: Wed, 3 Jun 2020 22:34:28 -0300 Subject: [PATCH 19/34] =?UTF-8?q?Status=20=C3=BAnico.=20Gerenciar=20livros?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/book/list/list.component.ts | 260 ++++++++++-------- 1 file changed, 147 insertions(+), 113 deletions(-) diff --git a/src/app/components/book/list/list.component.ts b/src/app/components/book/list/list.component.ts index 483d1719..2cfedf1d 100644 --- a/src/app/components/book/list/list.component.ts +++ b/src/app/components/book/list/list.component.ts @@ -18,7 +18,7 @@ import { MainUsersComponent } from '../main-users/main-users.component'; @Component({ selector: 'app-list', templateUrl: './list.component.html', - styleUrls: ['./list.component.css'] + styleUrls: ['./list.component.css'], }) export class ListComponent implements OnInit, OnDestroy { books: LocalDataSource; @@ -77,42 +77,43 @@ export class ListComponent implements OnInit, OnDestroy { getAllBooks() { this.isLoading = true; - this._scBook.getAll() - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe(resp => { - this.myBookArray = new Array(); - resp['items'].forEach(items => { - this.myBookArray.push({ - id: items.id, - creationDate: items.creationDate, - chooseDate: items.chooseDate, - bookTitle: items.title, - title: - items.title + - '
' + - items.author + - '
' + - items.totalInterested + - ' interessado(s)
' + - items.daysInShowcase + - ' dia(s) na vitrine', - users: - items.donor + - '
' + - (!!items.winner ? items.winner : '') + - '
' + - (!!items.facilitator ? items.facilitator : ''), - status: items.status, - donated: items.donated, - facilitatorNotes: !!items.facilitatorNotes ? items.facilitatorNotes : '', - trackingNumber: !!items.trackingNumber ? items.trackingNumber : '' + this._scBook + .getAll() + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe((resp) => { + this.myBookArray = new Array(); + resp['items'].forEach((items) => { + this.myBookArray.push({ + id: items.id, + creationDate: items.creationDate, + chooseDate: items.chooseDate, + bookTitle: items.title, + title: + items.title + + '
' + + items.author + + '
' + + items.totalInterested + + ' interessado(s)
' + + items.daysInShowcase + + ' dia(s) na vitrine', + users: + items.donor + + '
' + + (!!items.winner ? items.winner : '') + + '
' + + (!!items.facilitator ? items.facilitator : ''), + status: items.status, + donated: items.donated, + facilitatorNotes: !!items.facilitatorNotes + ? items.facilitatorNotes + : '', + trackingNumber: !!items.trackingNumber ? items.trackingNumber : '', + }); }); + this.books.load(this.myBookArray); + this.isLoading = false; }); - this.books.load(this.myBookArray); - this.isLoading = false; - }); } ngOnInit() { @@ -122,8 +123,11 @@ export class ListComponent implements OnInit, OnDestroy { // Carrega Status do ENUM BookDonationStatus const myBookDonationStatus = new Array(); - Object.keys(BookDonationStatus).forEach(key => { - myBookDonationStatus.push({ value: BookDonationStatus[key], title: BookDonationStatus[key] }); + Object.keys(BookDonationStatus).forEach((key) => { + myBookDonationStatus.push({ + value: BookDonationStatus[key], + title: BookDonationStatus[key], + }); }); const btnEdit = @@ -151,17 +155,23 @@ export class ListComponent implements OnInit, OnDestroy { title: 'Inclusão', type: 'html', valuePrepareFunction: (cell, row) => { - return this.getHtmlForCell(new DatePipe('en-US').transform(cell, 'dd/MM/yyyy'), row); + return this.getHtmlForCell( + new DatePipe('en-US').transform(cell, 'dd/MM/yyyy'), + row + ); }, - width: '10%' + width: '10%', }, chooseDate: { title: 'Escolha', type: 'html', valuePrepareFunction: (cell, row) => { - return this.getHtmlForCell(new DatePipe('en-US').transform(cell, 'dd/MM/yyyy'), row); + return this.getHtmlForCell( + new DatePipe('en-US').transform(cell, 'dd/MM/yyyy'), + row + ); }, - width: '10%' + width: '10%', }, title: { title: 'Título / Autor / Total Interessados / Dias na Vitrine', @@ -169,7 +179,7 @@ export class ListComponent implements OnInit, OnDestroy { valuePrepareFunction: (cell, row) => { return this.getHtmlForCell(cell, row); }, - width: '28%' + width: '28%', }, users: { title: 'Doador / Donatário / Facilitador', @@ -177,7 +187,7 @@ export class ListComponent implements OnInit, OnDestroy { valuePrepareFunction: (cell, row) => { return this.getHtmlForCell(cell, row); }, - width: '28%' + width: '28%', }, status: { title: 'Status', @@ -189,11 +199,11 @@ export class ListComponent implements OnInit, OnDestroy { type: 'list', config: { selectText: 'Selecionar...', - list: myBookDonationStatus - } + list: myBookDonationStatus, + }, }, - width: '10%' - } + width: '10%', + }, }, actions: { delete: false, @@ -203,34 +213,34 @@ export class ListComponent implements OnInit, OnDestroy { custom: [ { name: 'edit', - title: btnEdit + title: btnEdit, }, { name: 'CancelDonation', - title: btnCancelDonation + title: btnCancelDonation, }, { name: 'donate', - title: btnDonate + title: btnDonate, }, { name: 'FacilitatorNotes', - title: btnFacilitatorNotes + title: btnFacilitatorNotes, }, { name: 'trackNumber', - title: btnTrackNumber + title: btnTrackNumber, }, { name: 'showUsersInfo', - title: btnShowUsersInfo - } + title: btnShowUsersInfo, + }, ], - position: 'right' // left|right + position: 'right', // left|right }, attr: { - class: 'table table-bordered' - } + class: 'table table-bordered', + }, }; } @@ -238,41 +248,56 @@ export class ListComponent implements OnInit, OnDestroy { switch (event.action) { case 'CancelDonation': { // chamada do modal de confirmação antes de efetuar a ação do btnCancelDonation - if (event.data.donated || event.data.status === BookDonationStatus.CANCELED) { - alert('Livro já doado ou cancelado!'); - } else { - this.confirmationDialogService.confirm('Atenção!', 'Confirma o cancelamento da doação?').then(confirmed => { + if ( + event.data.status === BookDonationStatus.RECEIVED || + event.data.status === BookDonationStatus.CANCELED + ) { + alert( + `Não é possível cancelar essa doação com status = ${event.data.status}` + ); + return; + } + this.confirmationDialogService + .confirm('Atenção!', 'Confirma o cancelamento da doação?') + .then((confirmed) => { if (confirmed) { - this._scBook.cancelDonation(event.data.id) - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe(resp => { - if (resp['success']) { - this._toastr.success('Doação cancelada com sucesso.'); - this.reloadData(); - } - }); + this._scBook + .cancelDonation(event.data.id) + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe((resp) => { + if (resp['success']) { + this._toastr.success('Doação cancelada com sucesso.'); + this.reloadData(); + } + }); } }); - } + break; } case 'donate': { - if (event.data.donated || event.data.status === BookDonationStatus.CANCELED) { - alert('Livro já doado ou cancelado!'); - } else { - const chooseDate = Math.floor(new Date(event.data.chooseDate).getTime() / (3600 * 24 * 1000)); - const todayDate = Math.floor(new Date().getTime() / (3600 * 24 * 1000)); + if (event.data.status !== BookDonationStatus.WAITING_DECISION) { + alert( + `Não é possível escolher ganhador. \nstatus requerido = ${BookDonationStatus.WAITING_DECISION}\n` + + `status atual = ${event.data.status}` + ); + return; + } + const chooseDate = Math.floor( + new Date(event.data.chooseDate).getTime() / (3600 * 24 * 1000) + ); + const todayDate = Math.floor(new Date().getTime() / (3600 * 24 * 1000)); - if (!chooseDate || chooseDate - todayDate > 0) { - alert('Aguarde a data de escolha!'); - } else { - this._router.navigate([`book/donate/${event.data.id}`], { - queryParams: { returnUrl: this._activatedRoute.snapshot.url.join('/') } - }); - } + if (!chooseDate || chooseDate - todayDate > 0) { + alert('Aguarde a data de escolha!'); + } else { + this._router.navigate([`book/donate/${event.data.id}`], { + queryParams: { + returnUrl: this._activatedRoute.snapshot.url.join('/'), + }, + }); } + break; } case 'edit': { @@ -282,16 +307,16 @@ export class ListComponent implements OnInit, OnDestroy { case 'FacilitatorNotes': { const modalRef = this._modalService.open(FacilitatorNotesComponent, { backdropClass: 'light-blue-backdrop', - centered: true + centered: true, }); modalRef.result.then( - result => { + (result) => { if (result === 'Success') { this.reloadData(); } }, - reason => { + (reason) => { if (reason === 'Success') { this.reloadData(); } @@ -300,50 +325,59 @@ export class ListComponent implements OnInit, OnDestroy { modalRef.componentInstance.bookId = event.data.id; modalRef.componentInstance.bookTitle = event.data.bookTitle; - modalRef.componentInstance.facilitatorNotes = event.data.facilitatorNotes; + modalRef.componentInstance.facilitatorNotes = + event.data.facilitatorNotes; break; } case 'trackNumber': { - if (!event.data.donated) { - alert('Livro deve estar como doado!'); - } else { - const modalRef = this._modalService.open(TrackingComponent, { - backdropClass: 'light-blue-backdrop', - centered: true - }); + if ( + event.data.status !== BookDonationStatus.WAITING_SEND && + event.data.status !== BookDonationStatus.SENT + ) { + alert( + `Não é possível informar código de rastreio. \nstatus requerido = ${BookDonationStatus.WAITING_SEND} ou` + + `${BookDonationStatus.SENT}\nstatus atual = ${event.data.status}` + ); + return; + } - modalRef.result.then( - result => { - if (result === 'Success') { - this.reloadData(); - } - }, - reason => { - if (reason === 'Success') { - this.reloadData(); - } + const modalRef = this._modalService.open(TrackingComponent, { + backdropClass: 'light-blue-backdrop', + centered: true, + }); + + modalRef.result.then( + (result) => { + if (result === 'Success') { + this.reloadData(); } - ); + }, + (reason) => { + if (reason === 'Success') { + this.reloadData(); + } + } + ); + + modalRef.componentInstance.bookId = event.data.id; + modalRef.componentInstance.bookTitle = event.data.bookTitle; + modalRef.componentInstance.trackingNumber = event.data.trackingNumber; - modalRef.componentInstance.bookId = event.data.id; - modalRef.componentInstance.bookTitle = event.data.bookTitle; - modalRef.componentInstance.trackingNumber = event.data.trackingNumber; - } break; } case 'showUsersInfo': { const modalRef = this._modalService.open(MainUsersComponent, { backdropClass: 'light-blue-backdrop', - centered: true + centered: true, }); modalRef.result.then( - result => { + (result) => { if (result === 'Success') { this.reloadData(); } }, - reason => { + (reason) => { if (reason === 'Success') { this.reloadData(); } From 6131875772935c77a37db2402f4d448e792477f1 Mon Sep 17 00:00:00 2001 From: Raffaello Damgaard Date: Wed, 3 Jun 2020 22:35:27 -0300 Subject: [PATCH 20/34] =?UTF-8?q?Status=20=C3=BAnicos.=20campos=20cidade?= =?UTF-8?q?=20e=20estado=20no=20model.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/core/models/book.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/core/models/book.ts b/src/app/core/models/book.ts index b24e841e..8c107161 100644 --- a/src/app/core/models/book.ts +++ b/src/app/core/models/book.ts @@ -22,4 +22,6 @@ export class Book { id: string; creationDate: Date; status: BookDonationStatus; + city: string; + state: string; } From f2dd44893c6d20a4b9505e11b1d9616a58857af2 Mon Sep 17 00:00:00 2001 From: Raffaello Damgaard Date: Thu, 4 Jun 2020 16:01:48 -0300 Subject: [PATCH 21/34] =?UTF-8?q?Status=20=C3=BAnico.=20Editar/aprovar=20l?= =?UTF-8?q?ivro.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/book/form/form.component.html | 260 +++++++++++++----- .../components/book/form/form.component.ts | 123 +++++---- 2 files changed, 267 insertions(+), 116 deletions(-) diff --git a/src/app/components/book/form/form.component.html b/src/app/components/book/form/form.component.html index bdd634e1..76d62f44 100644 --- a/src/app/components/book/form/form.component.html +++ b/src/app/components/book/form/form.component.html @@ -1,20 +1,36 @@ -
+ @@ -37,16 +53,36 @@

{{ pageTitle }}

- + -
- +
+ Titulo do livro obrigatório. - + O titúlo deve conter no mínimo 3 caracteres. - + O titúlo deve conter no máximo 200 caracteres.
@@ -54,16 +90,35 @@

{{ pageTitle }}

- + -
- +
+ Informe o nome do autor do livro. - + O nome do autor deve conter no mínimo 3 caracteres. - + O nome do autor deve conter no máximo 200 caracteres.
@@ -73,27 +128,54 @@

{{ pageTitle }}

-
- +
+ Informe a categoria do livro.
-
- +
+
- + Informe o facilitador do livro.
@@ -109,20 +191,45 @@

{{ pageTitle }}

(imageSelected)="onConvertImageToBase64($event)" [allowedExtensions]="['jpg', 'jpeg', 'png']" /> -
-
- +
+ Arquivo de imagem com extensão inválida (jpg, jpeg, png).
- + Selecione a capa do livro.
@@ -130,20 +237,27 @@

{{ pageTitle }}

- Sabia que com o registro módico o envio de livros para todo Brasil fica baratinho? Em média apenas - dez reais. + Sabia que com o registro módico o envio de livros para todo + Brasil fica baratinho? Em média apenas dez reais.

Mais detalhes, - clique aqui.

- -
+ +
-
- +
+ Escolha uma opções de frete.
@@ -180,8 +307,16 @@

{{ pageTitle }}

style="height: 300px;" > -
- +
+ A sinópse deve conter no máximo 2000 caracteres.
@@ -189,35 +324,30 @@

{{ pageTitle }}

- +
-
- -
- -
@@ -231,7 +259,11 @@

Novidades da Fanpage

diff --git a/src/app/components/home/home.component.ts b/src/app/components/home/home.component.ts index 613e82d6..945ebfd8 100644 --- a/src/app/components/home/home.component.ts +++ b/src/app/components/home/home.component.ts @@ -8,10 +8,10 @@ import { Book } from '../../core/models/book'; @Component({ selector: 'app-home', templateUrl: './home.component.html', - styleUrls: ['./home.component.css'] + styleUrls: ['./home.component.css'], }) export class HomeComponent implements OnInit, OnDestroy { - public top15NewBooks: Book[] = []; + public availableBooks: Book[] = []; public random15NewBooks: Book[] = []; public hasBook: Boolean = true; @@ -20,20 +20,13 @@ export class HomeComponent implements OnInit, OnDestroy { constructor(private _scBook: BookService) {} ngOnInit() { - this._scBook.getTop15NewBooks() - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe(newBooks => { - this.top15NewBooks = newBooks; - this.hasBook = newBooks.length > 0 ? true : false; - - /*if (this.hasBook) { - this._scBook.getRandom15Books().subscribe(randomBooks => { - this.random15NewBooks = randomBooks; - }); - }*/ - }); + this._scBook + .getAvailableBooks() + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe((books) => { + this.availableBooks = books; + this.hasBook = books.length > 0 ? true : false; + }); } ngOnDestroy() { diff --git a/src/app/core/services/book/book.service.ts b/src/app/core/services/book/book.service.ts index c9b181fd..2776bee4 100644 --- a/src/app/core/services/book/book.service.ts +++ b/src/app/core/services/book/book.service.ts @@ -25,9 +25,9 @@ export class BookService { return this._http.get(`${this.config.apiEndpoint}/book/1/9999`); } - public getTop15NewBooks() { + public getAvailableBooks() { return this._http.get( - `${this.config.apiEndpoint}/book/Top15NewBooks` + `${this.config.apiEndpoint}/book/AvailableBooks` ); } From 0eb41cf15a8e119f04c103399d808ebc6d855ff6 Mon Sep 17 00:00:00 2001 From: Raffaello Damgaard Date: Tue, 9 Jun 2020 19:48:38 -0300 Subject: [PATCH 30/34] Add sandbox no git ignore. --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 19efa29e..e226c65a 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,6 @@ testem.log # System Files .DS_Store Thumbs.db + +# developer scripts +sandbox From 7531b4a7fc49bdf6402b6b1169f1d05953de272b Mon Sep 17 00:00:00 2001 From: Raffaello Damgaard Date: Tue, 9 Jun 2020 21:27:28 -0300 Subject: [PATCH 31/34] =?UTF-8?q?Corre=C3=A7=C3=A3o=20nos=20Enums.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/details/details.component.ts | 6 ++--- .../book/donations/donations.component.ts | 3 ++- .../components/book/form/form.component.ts | 4 +--- .../components/book/list/list.component.ts | 3 ++- src/app/core/models/BookDonationStatus.ts | 14 ++++++------ src/app/core/utils/getStatusDescription.ts | 22 +++++++++++++++++++ 6 files changed, 37 insertions(+), 15 deletions(-) create mode 100644 src/app/core/utils/getStatusDescription.ts diff --git a/src/app/components/book/details/details.component.ts b/src/app/components/book/details/details.component.ts index 38d435d6..2d228a95 100644 --- a/src/app/components/book/details/details.component.ts +++ b/src/app/components/book/details/details.component.ts @@ -116,19 +116,19 @@ export class DetailsComponent implements OnInit, OnDestroy { if (this.myUser.name) { switch (book.freightOption) { - case 'Cidade': { + case 'City': { if (book.city !== this.myUser.address.city) { this.isFreeFreight = false; } break; } - case 'Estado': { + case 'State': { if (book.state !== this.myUser.address.state) { this.isFreeFreight = false; } break; } - case 'Não': { + case 'WithoutFreight': { this.isFreeFreight = false; break; } diff --git a/src/app/components/book/donations/donations.component.ts b/src/app/components/book/donations/donations.component.ts index 56d6bebf..6c85efe6 100644 --- a/src/app/components/book/donations/donations.component.ts +++ b/src/app/components/book/donations/donations.component.ts @@ -12,6 +12,7 @@ import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { DonateComponent } from '../donate/donate.component'; import { ConfirmationDialogService } from 'src/app/core/services/confirmation-dialog/confirmation-dialog.service'; import { ToastrService } from 'ngx-toastr'; +import { getStatusDescription } from 'src/app/core/utils/getStatusDescription'; @Component({ selector: 'app-donations', @@ -91,7 +92,7 @@ export class DonationsComponent implements OnInit, OnDestroy { return this._sanitizer.bypassSecurityTrustHtml( `${value}` + )}">${getStatusDescription(value)}` ); }, filter: { diff --git a/src/app/components/book/form/form.component.ts b/src/app/components/book/form/form.component.ts index 8eeda051..55d84925 100644 --- a/src/app/components/book/form/form.component.ts +++ b/src/app/components/book/form/form.component.ts @@ -166,9 +166,7 @@ export class FormComponent implements OnInit, OnDestroy { ? book.userIdFacilitator : null, userId: book.userId, - freightOption: this.freightOptions.find( - (e) => e.text === book.freightOption - ).value, + freightOption: book.freightOption, imageBytes: '', imageName: null, imageUrl: book.imageUrl, diff --git a/src/app/components/book/list/list.component.ts b/src/app/components/book/list/list.component.ts index 2a9477ac..03261b88 100644 --- a/src/app/components/book/list/list.component.ts +++ b/src/app/components/book/list/list.component.ts @@ -15,6 +15,7 @@ import { FacilitatorNotesComponent } from '../facilitator-notes/facilitator-note import { TrackingComponent } from '../tracking/tracking.component'; import { MainUsersComponent } from '../main-users/main-users.component'; import { BookRequestStatus } from 'src/app/core/models/BookRequestStatus'; +import { getStatusDescription } from 'src/app/core/utils/getStatusDescription'; @Component({ selector: 'app-list', @@ -171,7 +172,7 @@ export class ListComponent implements OnInit, OnDestroy { title: 'Status', type: 'html', valuePrepareFunction: (cell, row) => { - return this.getHtmlForCell(cell, row); + return this.getHtmlForCell(getStatusDescription(row.status), row); }, filter: { type: 'list', diff --git a/src/app/core/models/BookDonationStatus.ts b/src/app/core/models/BookDonationStatus.ts index d286fc80..bdc156ef 100644 --- a/src/app/core/models/BookDonationStatus.ts +++ b/src/app/core/models/BookDonationStatus.ts @@ -1,9 +1,9 @@ export enum BookDonationStatus { - WAITING_APPROVAL = 'Aguardando aprovação', - AVAILABLE = 'Disponível', - WAITING_DECISION = 'Aguardando decisão do doador', - WAITING_SEND = 'Aguardando envio', - SENT = 'Enviado', - RECEIVED = 'Recebido', - CANCELED = 'Cancelado', + WAITING_APPROVAL = 'WaitingApproval', + AVAILABLE = 'Available', + WAITING_DECISION = 'AwaitingDonorDecision', + WAITING_SEND = 'WaitingSend', + SENT = 'Sent', + RECEIVED = 'Received', + CANCELED = 'Canceled', } diff --git a/src/app/core/utils/getStatusDescription.ts b/src/app/core/utils/getStatusDescription.ts new file mode 100644 index 00000000..f0c063fa --- /dev/null +++ b/src/app/core/utils/getStatusDescription.ts @@ -0,0 +1,22 @@ +import { BookDonationStatus } from '../models/BookDonationStatus'; + +export function getStatusDescription(status) { + switch (status) { + case BookDonationStatus.WAITING_APPROVAL: + return 'Aguardando aprovação'; + case BookDonationStatus.WAITING_DECISION: + return 'Aguardando decisão do doador'; + case BookDonationStatus.WAITING_SEND: + return 'Aguardando envio'; + case BookDonationStatus.SENT: + return 'Enviado'; + case BookDonationStatus.AVAILABLE: + return 'Disponível'; + case BookDonationStatus.RECEIVED: + return 'Recebido'; + case BookDonationStatus.CANCELED: + return 'Cancelado'; + default: + return '???'; + } +} From c236596258598911ca68b3f145aca706b1203d94 Mon Sep 17 00:00:00 2001 From: Raffaello Damgaard Date: Fri, 12 Jun 2020 12:22:16 -0300 Subject: [PATCH 32/34] Ajuste de enum no BookRequest. --- .../book/requesteds/requesteds.component.ts | 41 +++++++++---------- src/app/core/models/BookRequestStatus.ts | 17 ++++++-- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/src/app/components/book/requesteds/requesteds.component.ts b/src/app/components/book/requesteds/requesteds.component.ts index 58514e6a..fd323af1 100644 --- a/src/app/components/book/requesteds/requesteds.component.ts +++ b/src/app/components/book/requesteds/requesteds.component.ts @@ -3,12 +3,12 @@ import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { BookService } from '../../../core/services/book/book.service'; -import { BookRequestStatus } from '../../../core/models/BookRequestStatus'; +import { BookRequestStatus, getStatusDescription } from '../../../core/models/BookRequestStatus'; @Component({ selector: 'app-requesteds', templateUrl: './requesteds.component.html', - styleUrls: ['./requesteds.component.css'] + styleUrls: ['./requesteds.component.css'], }) export class RequestedsComponent implements OnInit, OnDestroy { requestedBooks = new Array(); @@ -22,50 +22,49 @@ export class RequestedsComponent implements OnInit, OnDestroy { ngOnInit() { this.isLoading = true; - this._bookService.getRequestedBooks(1, 9999) - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe(resp => { - this.requestedBooks = resp.items; - this.addBadgeToStatusColumn(); - this.isLoading = false; - }); + this._bookService + .getRequestedBooks(1, 9999) + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe((resp) => { + this.requestedBooks = resp.items; + this.addBadgeToStatusColumn(); + this.isLoading = false; + }); this.tableSettings = { columns: { title: { title: 'Titulo', - width: '45%' + width: '45%', }, author: { title: 'Autor', - width: '30%' + width: '30%', }, status: { title: 'Status', width: '25%', - type: 'html' - } + type: 'html', + }, }, actions: { delete: false, edit: false, add: false, - update: false + update: false, }, attr: { - class: 'table table-bordered table-hover table-striped' + class: 'table table-bordered table-hover table-striped', }, - noDataMessage: 'Nenhum registro encontrado.' + noDataMessage: 'Nenhum registro encontrado.', }; } public addBadgeToStatusColumn() { - this.requestedBooks.forEach(book => { + this.requestedBooks.forEach((book) => { let badgeColor = ''; - switch (book.status.toUpperCase()) { + switch (book.status) { case BookRequestStatus.DONATED: badgeColor = 'success'; break; @@ -77,7 +76,7 @@ export class RequestedsComponent implements OnInit, OnDestroy { break; } - book.status = `${book.status}`; + book.status = `${getStatusDescription(book.status)}`; }); } diff --git a/src/app/core/models/BookRequestStatus.ts b/src/app/core/models/BookRequestStatus.ts index c3242abd..77e7c93b 100644 --- a/src/app/core/models/BookRequestStatus.ts +++ b/src/app/core/models/BookRequestStatus.ts @@ -1,5 +1,16 @@ export enum BookRequestStatus { - DONATED = 'DOADO', - REFUSED = 'NÃO FOI DESSA VEZ', - AWAITING_ACTION = 'AGUARDANDO AÇÃO' + DONATED = 'Donated', + REFUSED = 'Denied', + AWAITING_ACTION = 'WaitingAction', +} + +export function getStatusDescription(RequestStatus) { + switch (RequestStatus) { + case BookRequestStatus.DONATED: + return 'Doado'; + case BookRequestStatus.REFUSED: + return 'Não foi dessa vez'; + case BookRequestStatus.AWAITING_ACTION: + return 'Aguardando decisão do doador'; + } } From 98aed33e0703de3490fac032295d3d3db871bad2 Mon Sep 17 00:00:00 2001 From: Raffaello Damgaard Date: Fri, 12 Jun 2020 12:23:18 -0300 Subject: [PATCH 33/34] Limite de 120 caracteres para o prettier. --- .prettierrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.prettierrc b/.prettierrc index 544138be..0981b7cc 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,3 +1,4 @@ { - "singleQuote": true + "singleQuote": true, + "printWidth": 120 } From d2d13cd315cf4a626f200c6d84bba82f6448e78c Mon Sep 17 00:00:00 2001 From: Raffaello Damgaard Date: Sat, 13 Jun 2020 20:34:08 -0300 Subject: [PATCH 34/34] Pequeno ajuste no endpoint de login. --- package.json | 2 +- .../authentication/authentication.service.ts | 46 ++++++++++--------- tsconfig.json | 11 ++--- 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index a6fa5e23..316dc23b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "frontend", - "version": "1.0.0", + "version": "v4.5.0", "description": "It's just a getting started of front end sharebook application", "main": "index.js", "repository": { diff --git a/src/app/core/services/authentication/authentication.service.ts b/src/app/core/services/authentication/authentication.service.ts index 8469df45..395a647f 100644 --- a/src/app/core/services/authentication/authentication.service.ts +++ b/src/app/core/services/authentication/authentication.service.ts @@ -1,12 +1,13 @@ import { Injectable, Inject } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; import { map } from 'rxjs/operators'; import { Router } from '@angular/router'; -import * as moment from 'moment-timezone'; +const moment = require('moment-timezone'); import { UserService } from '../user/user.service'; import { APP_CONFIG, AppConfig } from '../../../app-config.module'; +const { version } = require('package.json'); @Injectable() export class AuthenticationService { @@ -19,26 +20,29 @@ export class AuthenticationService { private _localStorageUserKey = 'shareBookUser'; login(email: string, password: string) { - return this.http - .post(`${this.config.apiEndpoint}/Account/Login/`, { - email: email, - password: password, + const url = `${this.config.apiEndpoint}/Account/Login/`; + const body = { + email: email, + password: password, + }; + const headers = new HttpHeaders({ + 'x-requested-with': 'web', + 'Client-Version': version, + }); + const options = { headers: headers }; + + return this.http.post(url, body, options).pipe( + map((response) => { + // login successful if there's a jwt token in the response + if (response.success || response.value.authenticated) { + // store user details and jwt token in local storage to keep user logged in between page refreshes + localStorage.setItem('shareBookUser', JSON.stringify(response.value)); + this._user.setLoggedUser(response.value); + } + + return response.value; }) - .pipe( - map((response) => { - // login successful if there's a jwt token in the response - if (response.success || response.value.authenticated) { - // store user details and jwt token in local storage to keep user logged in between page refreshes - localStorage.setItem( - 'shareBookUser', - JSON.stringify(response.value) - ); - this._user.setLoggedUser(response.value); - } - - return response.value; - }) - ); + ); } logout() { diff --git a/tsconfig.json b/tsconfig.json index ef44e286..08565f33 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,12 +9,9 @@ "emitDecoratorMetadata": true, "experimentalDecorators": true, "target": "es5", - "typeRoots": [ - "node_modules/@types" - ], - "lib": [ - "es2017", - "dom" - ] + "typeRoots": ["node_modules/@types"], + "lib": ["es2017", "dom"], + "resolveJsonModule": true, + "esModuleInterop": true } }