juice-shop

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

6
import { TranslateModule } from '@ngx-translate/core'
7
import { MatDividerModule } from '@angular/material/divider'
8
import { HttpClientTestingModule } from '@angular/common/http/testing'
9
import { type ComponentFixture, fakeAsync, TestBed, waitForAsync } from '@angular/core/testing'
10
import { RouterTestingModule } from '@angular/router/testing'
11
import { MatGridListModule } from '@angular/material/grid-list'
12
import { MatCardModule } from '@angular/material/card'
13
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'
14
import { MatTableModule } from '@angular/material/table'
15
import { MatPaginatorModule } from '@angular/material/paginator'
16
import { MatDialogModule } from '@angular/material/dialog'
17
import { of, throwError } from 'rxjs'
18
import { OrderCompletionComponent } from './order-completion.component'
19
import { TrackOrderService } from '../Services/track-order.service'
20
import { ActivatedRoute, convertToParamMap } from '@angular/router'
21
import { MatIconModule } from '@angular/material/icon'
22
import { BasketService } from '../Services/basket.service'
23
import { MatTooltipModule } from '@angular/material/tooltip'
24
import { AddressService } from '../Services/address.service'
25
import { ConfigurationService } from '../Services/configuration.service'
26

27
export class MockActivatedRoute {
28
  public paramMap = of(convertToParamMap({
29
    id: 'ad9b-96017e7cb1ae7bf9'
30
  }))
31
}
32

33
describe('OrderCompletionComponent', () => {
34
  let component: OrderCompletionComponent
35
  let fixture: ComponentFixture<OrderCompletionComponent>
36
  let trackOrderService: any
37
  let activatedRoute: any
38
  let basketService: any
39
  let addressService: any
40
  let configurationService: any
41

42
  beforeEach(waitForAsync(() => {
43
    configurationService = jasmine.createSpyObj('ConfigurationService', ['getApplicationConfiguration'])
44
    configurationService.getApplicationConfiguration.and.returnValue(of({}))
45
    trackOrderService = jasmine.createSpyObj('TrackOrderService', ['find'])
46
    trackOrderService.find.and.returnValue(of({ data: [{ products: [] }] }))
47
    activatedRoute = new MockActivatedRoute()
48
    addressService = jasmine.createSpyObj('AddressService', ['getById'])
49
    addressService.getById.and.returnValue(of([]))
50

51
    TestBed.configureTestingModule({
52
      declarations: [OrderCompletionComponent],
53
      imports: [
54
        RouterTestingModule,
55
        HttpClientTestingModule,
56
        TranslateModule.forRoot(),
57
        BrowserAnimationsModule,
58
        MatTableModule,
59
        MatPaginatorModule,
60
        MatDialogModule,
61
        MatDividerModule,
62
        MatGridListModule,
63
        MatCardModule,
64
        MatIconModule,
65
        MatTooltipModule
66
      ],
67
      providers: [
68
        { provide: TrackOrderService, useValue: trackOrderService },
69
        { provide: ActivatedRoute, useValue: activatedRoute },
70
        { provide: BasketService, useValue: basketService },
71
        { provide: ConfigurationService, useValue: configurationService },
72
        { provide: AddressService, useValue: addressService }
73
      ]
74
    })
75
      .compileComponents()
76
  }))
77

78
  beforeEach(() => {
79
    fixture = TestBed.createComponent(OrderCompletionComponent)
80
    component = fixture.componentInstance
81
    component.ngOnInit()
82
    fixture.detectChanges()
83
  })
84

85
  it('should create', () => {
86
    expect(component).toBeTruthy()
87
  })
88

89
  it('should hold order details returned by backend API', () => {
90
    trackOrderService.find.and.returnValue(of({ data: [{ totalPrice: 2.88, promotionalAmount: 10, deliveryPrice: 2, addressId: 1, paymentId: 1, products: [{ quantity: 1, name: 'Apple Juice (1000ml)', price: 1.99, total: 1.99, bonus: 0 }, { quantity: 1, name: 'Apple Pomace', price: 0.89, total: 0.89, bonus: 0 }], bonus: 0, eta: '5' }] }))
91
    component.ngOnInit()
92
    fixture.detectChanges()
93
    expect(component.promotionalDiscount).toBe(10)
94
    expect(component.deliveryPrice).toBe(2)
95
    expect(component.orderDetails.addressId).toBe(1)
96
    expect(component.orderDetails.paymentId).toBe(1)
97
    expect(parseFloat((component.orderDetails.totalPrice).toFixed(2))).toBe(2.88)
98
    expect(parseFloat((component.orderDetails.itemTotal).toFixed(2))).toBe(10.88)
99
    expect(component.orderDetails.eta).toBe('5')
100
    expect(component.orderDetails.bonus).toBe(0)
101
    expect(component.orderDetails.products.length).toBe(2)
102
    expect(component.orderDetails.products[0].name).toBe('Apple Juice (1000ml)')
103
    expect(component.orderDetails.products[1].name).toBe('Apple Pomace')
104
  })
105

106
  it('should have bullet point list of products in tweet', () => {
107
    trackOrderService.find.and.returnValue(of({ data: [{ products: [{ name: 'A' }, { name: 'B' }] }] }))
108
    configurationService.getApplicationConfiguration.and.returnValue(of({ }))
109
    component.ngOnInit()
110
    expect(component.tweetText).toBe('I just purchased%0a- A%0a- B')
111
  })
112

113
  it('should truncate tweet text if it exceeds 140 characters', () => {
114
    trackOrderService.find.and.returnValue(of({ data: [{ products: [{ name: 'AAAAAAAAAAAAAAAAAAAA' }, { name: 'BBBBBBBBBBBBBBBBBBBB' }, { name: 'CCCCCCCCCCCCCCCCCCCC' }, { name: 'DDDDDDDDDDDDDDDDDDDD' }, { name: 'EEEEEEEEEEEEEEEEEEEE' }, { name: 'FFFFFFFFFFFFFFFFFFFF' }] }] }))
115
    configurationService.getApplicationConfiguration.and.returnValue(of({ }))
116
    component.ngOnInit()
117
    expect(component.tweetText).toBe('I just purchased%0a- AAAAAAAAAAAAAAAAAAAA%0a- BBBBBBBBBBBBBBBBBBBB%0a- CCCCCCCCCCCCCCCCCCCC%0a- DDDDDDDDDDDDDDDDDDDD%0a- EEEEEEEEEEEEEEEEEEE...')
118
  })
119

120
  it('should derive twitter handle from twitter URL if configured', () => {
121
    trackOrderService.find.and.returnValue(of({ data: [{ products: [] }] }))
122
    configurationService.getApplicationConfiguration.and.returnValue(of({ application: { social: { twitterUrl: 'https://twitter.com/bkimminich' } } }))
123
    component.ngOnInit()
124
    expect(component.tweetText).toBe('I just purchased%0afrom @bkimminich')
125
  })
126

127
  it('should append twitter handle to truncated tweet text', () => {
128
    trackOrderService.find.and.returnValue(of({ data: [{ products: [{ name: 'AAAAAAAAAAAAAAAAAAAA' }, { name: 'BBBBBBBBBBBBBBBBBBBB' }, { name: 'CCCCCCCCCCCCCCCCCCCC' }, { name: 'DDDDDDDDDDDDDDDDDDDD' }, { name: 'EEEEEEEEEEEEEEEEEEEE' }, { name: 'FFFFFFFFFFFFFFFFFFFF' }] }] }))
129
    configurationService.getApplicationConfiguration.and.returnValue(of({ application: { social: { twitterUrl: 'https://twitter.com/owasp_juiceshop' } } }))
130
    component.ngOnInit()
131
    expect(component.tweetText).toBe('I just purchased%0a- AAAAAAAAAAAAAAAAAAAA%0a- BBBBBBBBBBBBBBBBBBBB%0a- CCCCCCCCCCCCCCCCCCCC%0a- DDDDDDDDDDDDDDDDDDDD%0a- EEEEEEEEEEEEEEEEEEE...%0afrom @owasp_juiceshop')
132
  })
133

134
  it('should use configured URL as is if it is not a twitter URL', () => {
135
    trackOrderService.find.and.returnValue(of({ data: [{ products: [] }] }))
136
    configurationService.getApplicationConfiguration.and.returnValue(of({ application: { social: { twitterUrl: 'http://localhorst:42' } } }))
137
    component.ngOnInit()
138
    expect(component.tweetText).toBe('I just purchased%0afrom http://localhorst:42')
139
  })
140

141
  it('should use configured application name as a fallback for missing twitter URL', () => {
142
    trackOrderService.find.and.returnValue(of({ data: [{ products: [] }] }))
143
    configurationService.getApplicationConfiguration.and.returnValue(of({ application: { name: 'OWASP Juice Shop', social: { twitterUrl: null } } }))
144
    component.ngOnInit()
145
    expect(component.tweetText).toBe('I just purchased%0afrom OWASP Juice Shop')
146
  })
147

148
  it('should log error while getting application configuration from backend API directly to browser console', fakeAsync(() => {
149
    trackOrderService.find.and.returnValue(of({ data: [{ products: [] }] }))
150
    configurationService.getApplicationConfiguration.and.returnValue(throwError('Error'))
151
    console.log = jasmine.createSpy('log')
152
    component.ngOnInit()
153
    expect(console.log).toHaveBeenCalledWith('Error')
154
  }))
155

156
  it('should log error while getting order details from backend API directly to browser console', fakeAsync(() => {
157
    trackOrderService.find.and.returnValue(throwError('Error'))
158
    console.log = jasmine.createSpy('log')
159
    component.ngOnInit()
160
    expect(console.log).toHaveBeenCalledWith('Error')
161
  }))
162
})
163

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

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

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

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