juice-shop

Форк
0
/
login.component.spec.ts 
175 строк · 6.4 Кб
1
/*
2
 * Copyright (c) 2014-2024 Bjoern Kimminich & the OWASP Juice Shop contributors.
3
 * SPDX-License-Identifier: MIT
4
 */
5

6
import { SearchResultComponent } from '../search-result/search-result.component'
7
import { WindowRefService } from '../Services/window-ref.service'
8
import { HttpClientTestingModule } from '@angular/common/http/testing'
9
import { UserService } from '../Services/user.service'
10
import { type ComponentFixture, fakeAsync, TestBed, tick, waitForAsync } from '@angular/core/testing'
11
import { LoginComponent } from './login.component'
12
import { RouterTestingModule } from '@angular/router/testing'
13
import { ReactiveFormsModule } from '@angular/forms'
14

15
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'
16
import { MatIconModule } from '@angular/material/icon'
17
import { MatCheckboxModule } from '@angular/material/checkbox'
18
import { MatFormFieldModule } from '@angular/material/form-field'
19
import { MatCardModule } from '@angular/material/card'
20
import { MatInputModule } from '@angular/material/input'
21
import { CookieModule, CookieService } from 'ngx-cookie'
22
import { Location } from '@angular/common'
23
import { of, throwError } from 'rxjs'
24
import { MatTableModule } from '@angular/material/table'
25
import { MatPaginatorModule } from '@angular/material/paginator'
26
import { MatDialogModule } from '@angular/material/dialog'
27
import { MatDividerModule } from '@angular/material/divider'
28
import { TranslateModule } from '@ngx-translate/core'
29
import { MatGridListModule } from '@angular/material/grid-list'
30
import { MatTooltipModule } from '@angular/material/tooltip'
31

32
describe('LoginComponent', () => {
33
  let component: LoginComponent
34
  let fixture: ComponentFixture<LoginComponent>
35
  let userService: any
36
  let location: Location
37

38
  beforeEach(waitForAsync(() => {
39
    userService = jasmine.createSpyObj('UserService', ['login'])
40
    userService.login.and.returnValue(of({}))
41
    userService.isLoggedIn = jasmine.createSpyObj('userService.isLoggedIn', ['next'])
42
    userService.isLoggedIn.next.and.returnValue({})
43

44
    TestBed.configureTestingModule({
45
      declarations: [LoginComponent, SearchResultComponent],
46
      imports: [
47
        HttpClientTestingModule,
48
        RouterTestingModule.withRoutes([
49
          { path: 'search', component: SearchResultComponent }
50
        ]
51
        ),
52
        ReactiveFormsModule,
53
        CookieModule.forRoot(),
54
        TranslateModule.forRoot(),
55
        BrowserAnimationsModule,
56
        MatCheckboxModule,
57
        MatFormFieldModule,
58
        MatCardModule,
59
        MatIconModule,
60
        MatInputModule,
61
        MatTableModule,
62
        MatPaginatorModule,
63
        MatDialogModule,
64
        MatDividerModule,
65
        MatGridListModule,
66
        MatTooltipModule
67
      ],
68
      providers: [
69
        { provide: UserService, useValue: userService },
70
        WindowRefService,
71
        CookieService
72
      ]
73
    })
74
      .compileComponents()
75

76
    location = TestBed.inject(Location)
77
  }))
78

79
  beforeEach(() => {
80
    localStorage.removeItem('token')
81
    localStorage.removeItem('email')
82
    sessionStorage.removeItem('bid')
83
    fixture = TestBed.createComponent(LoginComponent)
84
    component = fixture.componentInstance
85
    fixture.detectChanges()
86
  })
87

88
  it('should create', () => {
89
    expect(component).toBeTruthy()
90
  })
91

92
  it('should have email as compulsory', () => {
93
    component.emailControl.setValue('')
94
    expect(component.emailControl.valid).toBeFalsy()
95
    component.emailControl.setValue('Value')
96
    expect(component.emailControl.valid).toBe(true)
97
  })
98

99
  it('should have password as compulsory', () => {
100
    component.passwordControl.setValue('')
101
    expect(component.passwordControl.valid).toBeFalsy()
102
    component.passwordControl.setValue('Value')
103
    expect(component.passwordControl.valid).toBe(true)
104
  })
105

106
  it('should have remember-me checked if email token is present as in localStorage', () => {
107
    localStorage.setItem('email', 'a@a')
108
    component.ngOnInit()
109
    expect(component.rememberMe.value).toBe(true)
110
  })
111

112
  it('should have remember-me unchecked if email token is not present in localStorage', () => {
113
    component.ngOnInit()
114
    expect(component.rememberMe.value).toBeFalsy()
115
  })
116

117
  it('should flag OAuth as disabled if server is running on unauthorized redirect URI', () => {
118
    expect(component.oauthUnavailable).toBe(true)
119
  })
120

121
  it('forwards to main page after successful login', fakeAsync(() => {
122
    userService.login.and.returnValue(of({}))
123
    component.login()
124
    tick()
125
    expect(location.path()).toBe('/search')
126
  }))
127

128
  it('stores the returned authentication token in localStorage', () => {
129
    userService.login.and.returnValue(of({ token: 'token' }))
130
    component.login()
131
    expect(localStorage.getItem('token')).toBe('token')
132
  })
133

134
  it('puts the returned basket id into browser session storage', () => {
135
    userService.login.and.returnValue(of({ bid: 4711 }))
136
    component.login()
137
    expect(sessionStorage.getItem('bid')).toBe('4711')
138
  })
139

140
  it('removes authentication token and basket id on failed login attempt', fakeAsync(() => {
141
    userService.login.and.returnValue(throwError({ error: 'Error' }))
142
    component.login()
143
    expect(localStorage.getItem('token')).toBeNull()
144
    expect(sessionStorage.getItem('bid')).toBeNull()
145
  }))
146

147
  it('returns error message from server to client on failed login attempt', fakeAsync(() => {
148
    userService.login.and.returnValue(throwError({ error: 'Error' }))
149
    component.login()
150
    expect(component.error).toBeTruthy()
151
  }))
152

153
  it('sets form to pristine on failed login attempt', fakeAsync(() => {
154
    userService.login.and.returnValue(throwError({ error: 'Error' }))
155
    component.login()
156
    expect(component.emailControl.pristine).toBe(true)
157
    expect(component.passwordControl.pristine).toBe(true)
158
  }))
159

160
  it('puts current email into "email" cookie on successful login with remember-me checkbox ticked', () => {
161
    userService.login.and.returnValue(of({}))
162
    component.emailControl.setValue('horst@juice-sh.op')
163
    component.rememberMe.setValue(true)
164
    component.login()
165
    expect(localStorage.getItem('email')).toBe('horst@juice-sh.op')
166
  })
167

168
  it('puts current email into "email" cookie on failed login with remember-me checkbox ticked', fakeAsync(() => {
169
    userService.login.and.returnValue(throwError({ error: 'Error' }))
170
    component.emailControl.setValue('horst@juice-sh.op')
171
    component.rememberMe.setValue(true)
172
    component.login()
173
    expect(localStorage.getItem('email')).toBe('horst@juice-sh.op')
174
  }))
175
})
176

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.