generator-jhipster 7.2.0 → 7.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli/environment-builder.js +1 -0
- package/cli/import-jdl.js +2 -2
- package/cli/jdl.js +1 -0
- package/generators/bootstrap/index.js +2 -1
- package/generators/client/__workflow/devserver-angular.json +1 -1
- package/generators/client/__workflow/devserver-react.json +1 -1
- package/generators/client/__workflow/devserver-vue.json +1 -1
- package/generators/client/files-vue.js +2 -0
- package/generators/client/index.js +69 -0
- package/generators/client/templates/angular/package.json +12 -12
- package/generators/client/templates/angular/package.json.ejs +2 -1
- package/generators/client/templates/angular/src/main/webapp/app/admin/configuration/configuration.service.spec.ts.ejs +50 -52
- package/generators/client/templates/angular/src/main/webapp/app/admin/logs/logs.service.spec.ts.ejs +19 -21
- package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/metrics.service.spec.ts.ejs +62 -64
- package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/service/user-management.service.spec.ts.ejs +41 -43
- package/generators/client/templates/angular/src/main/webapp/app/app.module.ts.ejs +3 -0
- package/generators/client/templates/angular/src/main/webapp/app/core/auth/account.service.spec.ts.ejs +178 -180
- package/generators/client/templates/angular/src/main/webapp/app/core/config/application-config.service.ts.ejs +9 -0
- package/generators/client/templates/angular/src/main/webapp/app/entities/user/user.service.spec.ts.ejs +87 -89
- package/generators/client/templates/angular/webpack/webpack.custom.js.ejs +2 -3
- package/generators/client/templates/common/README.md.jhi.client.ejs +34 -0
- package/generators/client/templates/common/package.json +3 -3
- package/generators/client/templates/react/package.json +29 -29
- package/generators/client/templates/react/package.json.ejs +1 -1
- package/generators/client/templates/vue/package.json +22 -22
- package/generators/client/templates/vue/package.json.ejs +1 -1
- package/generators/client/templates/vue/src/main/webapp/app/account/account.service.ts.ejs +2 -2
- package/generators/client/templates/vue/src/main/webapp/app/admin/configuration/configuration.service.ts.ejs +1 -1
- package/generators/client/templates/vue/src/main/webapp/app/admin/tracker/tracker.service.ts.ejs +5 -4
- package/generators/client/templates/vue/src/main/webapp/app/admin/user-management/user-management-edit.component.ts.ejs +9 -0
- package/generators/client/templates/vue/src/main/webapp/app/admin/user-management/user-management-view.component.ts.ejs +5 -0
- package/generators/client/templates/vue/src/main/webapp/app/admin/user-management/user-management.component.ts.ejs +5 -0
- package/generators/client/templates/vue/src/main/webapp/app/main.ts.ejs +4 -2
- package/generators/client/templates/vue/src/main/webapp/app/router/admin.ts.ejs +4 -4
- package/generators/client/templates/vue/src/main/webapp/app/shared/alert/alert.service.ts.ejs +61 -0
- package/generators/client/templates/vue/src/test/javascript/spec/app/account/account.service.spec.ts.ejs +2 -2
- package/generators/client/templates/vue/src/test/javascript/spec/app/account/login-form/login-form.component.spec.ts.ejs +1 -1
- package/generators/client/templates/vue/src/test/javascript/spec/app/admin/tracker/tracker.component.spec.ts.ejs +12 -12
- package/generators/client/templates/vue/src/test/javascript/spec/app/admin/tracker/tracker.service.spec.ts.ejs +2 -1
- package/generators/client/templates/vue/src/test/javascript/spec/app/admin/user-management/user-management-edit.component.spec.ts.ejs +3 -1
- package/generators/client/templates/vue/src/test/javascript/spec/app/admin/user-management/user-management-view.component.spec.ts.ejs +2 -1
- package/generators/client/templates/vue/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts.ejs +3 -1
- package/generators/client/templates/vue/src/test/javascript/spec/app/shared/alert/alert.service.spec.ts.ejs +124 -0
- package/generators/common/templates/.husky/pre-commit +1 -1
- package/generators/common/templates/package.json +3 -3
- package/generators/docker-compose/templates/realm-config/jhipster-realm.json.ejs +13 -12
- package/generators/entity/index.js +13 -0
- package/generators/entity-client/index.js +53 -0
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/entity-management.module.ts.ejs +1 -1
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/route/entity-management-routing-resolve.service.spec.ts.ejs +52 -54
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/service/entity.service.spec.ts.ejs +173 -175
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-management-update.component.html.ejs +2 -4
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-management-update.component.ts.ejs +7 -0
- package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity-delete-dialog.tsx.ejs +5 -2
- package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity-details.component.ts.ejs +5 -0
- package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity-update.component.ts.ejs +14 -2
- package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity.component.ts.ejs +7 -0
- package/generators/entity-client/templates/vue/src/test/javascript/spec/app/entities/entity-details.component.spec.ts.ejs +2 -1
- package/generators/entity-client/templates/vue/src/test/javascript/spec/app/entities/entity-update.component.spec.ts.ejs +2 -0
- package/generators/entity-client/templates/vue/src/test/javascript/spec/app/entities/entity.component.spec.ts.ejs +3 -1
- package/generators/entity-server/files-couchbase.js +2 -2
- package/generators/entity-server/files.js +31 -30
- package/generators/entity-server/templates/couchbase/src/main/java/package/repository/EntityRepository.java.ejs +2 -2
- package/generators/entity-server/templates/couchbase/src/main/resources/config/couchmove/changelog/entity.fts.ejs +1 -1
- package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.ejs +2 -2
- package/generators/entity-server/templates/src/main/java/package/domain/enumeration/Enum.java.ejs +1 -1
- package/generators/entity-server/templates/src/main/java/package/repository/EntityRepository.java.ejs +2 -2
- package/generators/entity-server/templates/src/main/java/package/repository/EntityRepositoryInternalImpl_reactive.java.ejs +7 -7
- package/generators/entity-server/templates/src/main/java/package/repository/EntityRepository_reactive.java.ejs +2 -2
- package/generators/entity-server/templates/src/main/java/package/repository/rowmapper/EntityRowMapper.java.ejs +4 -4
- package/generators/entity-server/templates/src/main/java/package/repository/search/EntitySearchRepository.java.ejs +2 -2
- package/generators/entity-server/templates/src/main/java/package/service/EntityQueryService.java.ejs +8 -8
- package/generators/entity-server/templates/src/main/java/package/service/EntityService.java.ejs +4 -4
- package/generators/entity-server/templates/src/main/java/package/service/criteria/EntityCriteria.java.ejs +4 -4
- package/generators/entity-server/templates/src/main/java/package/service/dto/EntityDTO.java.ejs +3 -3
- package/generators/entity-server/templates/src/main/java/package/service/impl/EntityServiceImpl.java.ejs +8 -8
- package/generators/entity-server/templates/src/main/java/package/service/mapper/BaseEntityMapper.java.ejs +1 -1
- package/generators/entity-server/templates/src/main/java/package/service/mapper/EntityMapper.java.ejs +3 -3
- package/generators/entity-server/templates/src/main/java/package/web/rest/EntityResource.java.ejs +12 -12
- package/generators/entity-server/templates/src/test/java/package/domain/EntityTest.java.ejs +1 -1
- package/generators/entity-server/templates/src/test/java/package/repository/search/EntitySearchRepositoryMockConfiguration.java.ejs +1 -1
- package/generators/entity-server/templates/src/test/java/package/service/dto/EntityDTOTest.java.ejs +1 -1
- package/generators/entity-server/templates/src/test/java/package/service/mapper/EntityMapperTest.java.ejs +1 -1
- package/generators/entity-server/templates/src/test/java/package/web/rest/EntityResourceIT.java.ejs +18 -15
- package/generators/generator-base.js +10 -3
- package/generators/generator-constants.js +6 -5
- package/generators/heroku/index.js +13 -15
- package/generators/init/templates/.husky/pre-commit +1 -1
- package/generators/kubernetes-helm/templates/app/Chart.yml.ejs +22 -0
- package/generators/kubernetes-helm/templates/app/requirements.yml.ejs +2 -2
- package/generators/kubernetes-helm/templates/csvc/Chart.yml.ejs +17 -0
- package/generators/kubernetes-helm/templates/csvc/requirements.yml.ejs +3 -3
- package/generators/languages/templates/src/main/webapp/i18n/hr/reset.json.ejs +1 -2
- package/generators/maven/templates/.mvn/wrapper/maven-wrapper.properties +1 -1
- package/generators/server/index.js +38 -13
- package/generators/server/needle-api/needle-server-cache.js +4 -6
- package/generators/server/templates/.mvn/wrapper/maven-wrapper.properties +1 -1
- package/generators/server/templates/build.gradle.ejs +1 -1
- package/generators/server/templates/gradle.properties.ejs +1 -1
- package/generators/server/templates/pom.xml.ejs +4 -3
- package/generators/server/templates/settings.gradle.ejs +9 -0
- package/generators/server/templates/src/main/docker/app.yml.ejs +1 -0
- package/generators/server/templates/src/main/docker/config/realm-config/jhipster-realm.json.ejs +13 -12
- package/generators/server/templates/src/main/java/package/aop/logging/LoggingAspect.java.ejs +1 -1
- package/generators/server/templates/src/main/java/package/config/DatabaseConfiguration_cassandra.java.ejs +0 -6
- package/generators/server/templates/src/main/java/package/config/DatabaseConfiguration_sql.java.ejs +2 -2
- package/generators/server/templates/src/main/java/package/config/JacksonConfiguration.java.ejs +1 -1
- package/generators/server/templates/src/main/java/package/config/LocaleConfiguration.java.ejs +0 -2
- package/generators/server/templates/src/main/java/package/config/SecurityConfiguration.java.ejs +2 -5
- package/generators/server/templates/src/main/java/package/config/SecurityConfiguration_reactive.java.ejs +9 -1
- package/generators/server/templates/src/main/java/package/security/PersistentTokenRememberMeServices.java.ejs +0 -2
- package/generators/server/templates/src/main/resources/config/application-dev.yml.ejs +1 -1
- package/generators/server/templates/src/main/resources/config/application-prod.yml.ejs +1 -1
- package/generators/server/templates/src/main/resources/config/application.yml.ejs +2 -2
- package/package.json +12 -12
- package/utils/field.js +1 -1
|
@@ -30,65 +30,63 @@ import { User } from '../user-management.model';
|
|
|
30
30
|
|
|
31
31
|
import { UserManagementService } from './user-management.service';
|
|
32
32
|
|
|
33
|
-
describe('Service
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
let httpMock: HttpTestingController;
|
|
37
|
-
|
|
38
|
-
beforeEach(() => {
|
|
39
|
-
TestBed.configureTestingModule({
|
|
40
|
-
imports: [HttpClientTestingModule],
|
|
41
|
-
});
|
|
33
|
+
describe('User Service', () => {
|
|
34
|
+
let service: UserManagementService;
|
|
35
|
+
let httpMock: HttpTestingController;
|
|
42
36
|
|
|
43
|
-
|
|
44
|
-
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
TestBed.configureTestingModule({
|
|
39
|
+
imports: [HttpClientTestingModule],
|
|
45
40
|
});
|
|
46
41
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
42
|
+
service = TestBed.inject(UserManagementService);
|
|
43
|
+
httpMock = TestBed.inject(HttpTestingController);
|
|
44
|
+
});
|
|
50
45
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
46
|
+
afterEach(() => {
|
|
47
|
+
httpMock.verify();
|
|
48
|
+
});
|
|
54
49
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
50
|
+
describe('Service methods', () => {
|
|
51
|
+
it('should return User', () => {
|
|
52
|
+
let expectedResult: string | undefined;
|
|
58
53
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
expect(expectedResult).toEqual('user');
|
|
54
|
+
service.find('user').subscribe(received => {
|
|
55
|
+
expectedResult = received.login;
|
|
62
56
|
});
|
|
63
57
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
58
|
+
const req = httpMock.expectOne({ method: 'GET' });
|
|
59
|
+
req.flush(new User(<%- tsKeyId %>, 'user'));
|
|
60
|
+
expect(expectedResult).toEqual('user');
|
|
61
|
+
});
|
|
67
62
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const req = httpMock.expectOne({ method: 'GET' });
|
|
63
|
+
<%_ if (databaseTypeSql || databaseTypeMongodb || databaseTypeCouchbase) { _%>
|
|
64
|
+
it('should return Authorities', () => {
|
|
65
|
+
let expectedResult: string[] = [];
|
|
72
66
|
|
|
73
|
-
|
|
74
|
-
|
|
67
|
+
service.authorities().subscribe(authorities => {
|
|
68
|
+
expectedResult = authorities;
|
|
75
69
|
});
|
|
70
|
+
const req = httpMock.expectOne({ method: 'GET' });
|
|
71
|
+
|
|
72
|
+
req.flush([Authority.USER, Authority.ADMIN]);
|
|
73
|
+
expect(expectedResult).toEqual([Authority.USER, Authority.ADMIN]);
|
|
74
|
+
});
|
|
76
75
|
<%_ } _%>
|
|
77
76
|
|
|
78
|
-
|
|
79
|
-
|
|
77
|
+
it('should propagate not found response', () => {
|
|
78
|
+
let expectedResult = 0;
|
|
80
79
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
80
|
+
service.find('user').subscribe({
|
|
81
|
+
error: (error: HttpErrorResponse) => expectedResult = error.status
|
|
82
|
+
});
|
|
84
83
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
});
|
|
90
|
-
expect(expectedResult).toEqual(404);
|
|
84
|
+
const req = httpMock.expectOne({ method: 'GET' });
|
|
85
|
+
req.flush('Invalid request parameters', {
|
|
86
|
+
status: 404,
|
|
87
|
+
statusText: 'Bad Request',
|
|
91
88
|
});
|
|
89
|
+
expect(expectedResult).toEqual(404);
|
|
92
90
|
});
|
|
93
91
|
});
|
|
94
92
|
});
|
|
@@ -113,6 +113,9 @@ import { ErrorComponent } from './layouts/error/error.component';
|
|
|
113
113
|
})
|
|
114
114
|
export class AppModule {
|
|
115
115
|
constructor(applicationConfigService: ApplicationConfigService, iconLibrary: FaIconLibrary, dpConfig: NgbDatepickerConfig<% if (enableTranslation) { %>, translateService: TranslateService, sessionStorageService: SessionStorageService<% } %>) {
|
|
116
|
+
<%_ if (applicationTypeMicroservice) { _%>
|
|
117
|
+
applicationConfigService.setMicrofrontend();
|
|
118
|
+
<%_ } _%>
|
|
116
119
|
applicationConfigService.setEndpointPrefix(SERVER_API_URL);
|
|
117
120
|
registerLocaleData(locale);
|
|
118
121
|
iconLibrary.addIcons(...fontAwesomeIcons);
|
|
@@ -58,257 +58,255 @@ function accountWithAuthorities(authorities: string[]): Account {
|
|
|
58
58
|
};
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
describe('Service
|
|
62
|
-
|
|
63
|
-
let service: AccountService;
|
|
61
|
+
describe('Account Service', () => {
|
|
62
|
+
let service: AccountService;
|
|
64
63
|
<%_ if (!skipUserManagement) { _%>
|
|
65
|
-
|
|
64
|
+
let applicationConfigService: ApplicationConfigService;
|
|
66
65
|
<%_ } _%>
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
let httpMock: HttpTestingController;
|
|
67
|
+
let mockStorageService: StateStorageService;
|
|
68
|
+
let mockRouter: Router;
|
|
70
69
|
<%_ if (communicationSpringWebsocket) { _%>
|
|
71
|
-
|
|
70
|
+
let mockTrackerService: TrackerService;
|
|
72
71
|
<%_ } _%>
|
|
73
72
|
<%_ if (enableTranslation) { _%>
|
|
74
|
-
|
|
75
|
-
|
|
73
|
+
let mockTranslateService: TranslateService;
|
|
74
|
+
let sessionStorageService: SessionStorageService;
|
|
76
75
|
<%_ } _%>
|
|
77
76
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
77
|
+
beforeEach(() => {
|
|
78
|
+
TestBed.configureTestingModule({
|
|
79
|
+
imports: [HttpClientTestingModule, NgxWebstorageModule.forRoot()],
|
|
80
|
+
providers: [
|
|
82
81
|
<%_ if (enableTranslation) { _%>
|
|
83
|
-
|
|
82
|
+
TranslateService,
|
|
84
83
|
<%_ } _%>
|
|
85
84
|
<%_ if (communicationSpringWebsocket) { _%>
|
|
86
|
-
|
|
85
|
+
TrackerService,
|
|
87
86
|
<%_ } _%>
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
87
|
+
StateStorageService,
|
|
88
|
+
Router,
|
|
89
|
+
],
|
|
90
|
+
});
|
|
92
91
|
|
|
93
|
-
|
|
92
|
+
service = TestBed.inject(AccountService);
|
|
94
93
|
<%_ if (!skipUserManagement) { _%>
|
|
95
|
-
|
|
94
|
+
applicationConfigService = TestBed.inject(ApplicationConfigService);
|
|
96
95
|
<%_ } _%>
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
96
|
+
httpMock = TestBed.inject(HttpTestingController);
|
|
97
|
+
mockStorageService = TestBed.inject(StateStorageService);
|
|
98
|
+
mockRouter = TestBed.inject(Router);
|
|
100
99
|
<%_ if (communicationSpringWebsocket) { _%>
|
|
101
|
-
|
|
100
|
+
mockTrackerService = TestBed.inject(TrackerService);
|
|
102
101
|
<%_ } _%>
|
|
103
102
|
<%_ if (enableTranslation) { _%>
|
|
104
|
-
|
|
105
|
-
|
|
103
|
+
mockTranslateService = TestBed.inject(TranslateService);
|
|
104
|
+
sessionStorageService = TestBed.inject(SessionStorageService);
|
|
106
105
|
<%_ } _%>
|
|
107
|
-
|
|
106
|
+
});
|
|
108
107
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
108
|
+
afterEach(() => {
|
|
109
|
+
httpMock.verify();
|
|
110
|
+
});
|
|
112
111
|
|
|
113
112
|
<%_ if (!skipUserManagement) { _%>
|
|
114
|
-
|
|
115
|
-
|
|
113
|
+
describe('save', () => {
|
|
114
|
+
it('should call account saving endpoint with correct values', () => {
|
|
115
|
+
// GIVEN
|
|
116
|
+
const account = accountWithAuthorities([]);
|
|
117
|
+
|
|
118
|
+
// WHEN
|
|
119
|
+
service.save(account).subscribe();
|
|
120
|
+
const testRequest = httpMock.expectOne({ method: 'POST', url: applicationConfigService.getEndpointFor('api/account') });
|
|
121
|
+
testRequest.flush({});
|
|
122
|
+
|
|
123
|
+
// THEN
|
|
124
|
+
expect(testRequest.request.body).toEqual(account);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
<%_ } _%>
|
|
129
|
+
describe('authenticate', () => {
|
|
130
|
+
it('authenticationState should emit null if input is null', () => {
|
|
116
131
|
// GIVEN
|
|
117
|
-
|
|
132
|
+
let userIdentity: Account | null = accountWithAuthorities([]);
|
|
133
|
+
service.getAuthenticationState().subscribe(account => (userIdentity = account));
|
|
118
134
|
|
|
119
135
|
// WHEN
|
|
120
|
-
service.
|
|
121
|
-
const testRequest = httpMock.expectOne({ method: 'POST', url: applicationConfigService.getEndpointFor('api/account') });
|
|
122
|
-
testRequest.flush({});
|
|
136
|
+
service.authenticate(null);
|
|
123
137
|
|
|
124
138
|
// THEN
|
|
125
|
-
expect(
|
|
139
|
+
expect(userIdentity).toBeNull();
|
|
140
|
+
expect(service.isAuthenticated()).toBe(false);
|
|
141
|
+
<%_ if (communicationSpringWebsocket) { _%>
|
|
142
|
+
expect(mockTrackerService.disconnect).toHaveBeenCalled();
|
|
143
|
+
expect(mockTrackerService.connect).not.toHaveBeenCalled();
|
|
144
|
+
<%_ } _%>
|
|
126
145
|
});
|
|
127
|
-
});
|
|
128
146
|
|
|
147
|
+
it('authenticationState should emit the same account as was in input parameter', () => {
|
|
148
|
+
// GIVEN
|
|
149
|
+
const expectedResult = accountWithAuthorities([]);
|
|
150
|
+
let userIdentity: Account | null = null;
|
|
151
|
+
service.getAuthenticationState().subscribe(account => (userIdentity = account));
|
|
152
|
+
|
|
153
|
+
// WHEN
|
|
154
|
+
service.authenticate(expectedResult);
|
|
155
|
+
|
|
156
|
+
// THEN
|
|
157
|
+
expect(userIdentity).toEqual(expectedResult);
|
|
158
|
+
expect(service.isAuthenticated()).toBe(true);
|
|
159
|
+
<%_ if (communicationSpringWebsocket) { _%>
|
|
160
|
+
expect(mockTrackerService.connect).toHaveBeenCalled();
|
|
161
|
+
expect(mockTrackerService.disconnect).not.toHaveBeenCalled();
|
|
129
162
|
<%_ } _%>
|
|
130
|
-
|
|
131
|
-
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
describe('identity', () => {
|
|
167
|
+
it('should call /account only once if last call have not returned', () => {
|
|
168
|
+
// When I call
|
|
169
|
+
service.identity().subscribe();
|
|
170
|
+
// Once more
|
|
171
|
+
service.identity().subscribe();
|
|
172
|
+
// Then there is only request
|
|
173
|
+
httpMock.expectOne({ method: 'GET' });
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it('should call /account only once if not logged out after first authentication and should call /account again if user has logged out', () => {
|
|
177
|
+
// Given the user is authenticated
|
|
178
|
+
service.identity().subscribe();
|
|
179
|
+
httpMock.expectOne({ method: 'GET' }).flush({});
|
|
180
|
+
|
|
181
|
+
// When I call
|
|
182
|
+
service.identity().subscribe();
|
|
183
|
+
|
|
184
|
+
// Then there is no second request
|
|
185
|
+
httpMock.expectNone({ method: 'GET' });
|
|
186
|
+
|
|
187
|
+
// When I log out
|
|
188
|
+
service.authenticate(null);
|
|
189
|
+
// and then call
|
|
190
|
+
service.identity().subscribe();
|
|
191
|
+
|
|
192
|
+
// Then there is a new request
|
|
193
|
+
httpMock.expectOne({ method: 'GET' });
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
<%_ if (enableTranslation) { _%>
|
|
197
|
+
describe('should change the language on authentication if necessary', () => {
|
|
198
|
+
it('should change language if user has not changed language manually', () => {
|
|
132
199
|
// GIVEN
|
|
133
|
-
|
|
134
|
-
service.getAuthenticationState().subscribe(account => (userIdentity = account));
|
|
200
|
+
sessionStorageService.retrieve = jest.fn(key => (key === 'locale' ? undefined : 'otherSessionStorageValue'));
|
|
135
201
|
|
|
136
202
|
// WHEN
|
|
137
|
-
service.
|
|
203
|
+
service.identity().subscribe();
|
|
204
|
+
httpMock.expectOne({ method: 'GET' }).flush({ ...accountWithAuthorities([]), langKey: 'accountLang' });
|
|
138
205
|
|
|
139
206
|
// THEN
|
|
140
|
-
expect(
|
|
141
|
-
expect(service.isAuthenticated()).toBe(false);
|
|
142
|
-
<%_ if (communicationSpringWebsocket) { _%>
|
|
143
|
-
expect(mockTrackerService.disconnect).toHaveBeenCalled();
|
|
144
|
-
expect(mockTrackerService.connect).not.toHaveBeenCalled();
|
|
145
|
-
<%_ } _%>
|
|
207
|
+
expect(mockTranslateService.use).toHaveBeenCalledWith('accountLang');
|
|
146
208
|
});
|
|
147
209
|
|
|
148
|
-
it('
|
|
210
|
+
it('should not change language if user has changed language manually', () => {
|
|
149
211
|
// GIVEN
|
|
150
|
-
|
|
151
|
-
let userIdentity: Account | null = null;
|
|
152
|
-
service.getAuthenticationState().subscribe(account => (userIdentity = account));
|
|
212
|
+
sessionStorageService.retrieve = jest.fn(key => (key === 'locale' ? 'sessionLang' : undefined));
|
|
153
213
|
|
|
154
214
|
// WHEN
|
|
155
|
-
service.
|
|
215
|
+
service.identity().subscribe();
|
|
216
|
+
httpMock.expectOne({ method: 'GET' }).flush({ ...accountWithAuthorities([]), langKey: 'accountLang' });
|
|
156
217
|
|
|
157
218
|
// THEN
|
|
158
|
-
expect(
|
|
159
|
-
expect(service.isAuthenticated()).toBe(true);
|
|
160
|
-
<%_ if (communicationSpringWebsocket) { _%>
|
|
161
|
-
expect(mockTrackerService.connect).toHaveBeenCalled();
|
|
162
|
-
expect(mockTrackerService.disconnect).not.toHaveBeenCalled();
|
|
163
|
-
<%_ } _%>
|
|
219
|
+
expect(mockTranslateService.use).not.toHaveBeenCalled();
|
|
164
220
|
});
|
|
165
221
|
});
|
|
166
222
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
service.identity().subscribe();
|
|
173
|
-
// Then there is only request
|
|
174
|
-
httpMock.expectOne({ method: 'GET' });
|
|
175
|
-
});
|
|
223
|
+
<%_ } _%>
|
|
224
|
+
describe('navigateToStoredUrl', () => {
|
|
225
|
+
it('should navigate to the previous stored url post successful authentication', () => {
|
|
226
|
+
// GIVEN
|
|
227
|
+
mockStorageService.getUrl = jest.fn(() => 'admin/users?page=0');
|
|
176
228
|
|
|
177
|
-
|
|
178
|
-
// Given the user is authenticated
|
|
229
|
+
// WHEN
|
|
179
230
|
service.identity().subscribe();
|
|
180
231
|
httpMock.expectOne({ method: 'GET' }).flush({});
|
|
181
232
|
|
|
182
|
-
//
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
233
|
+
// THEN
|
|
234
|
+
expect(mockStorageService.getUrl).toHaveBeenCalledTimes(1);
|
|
235
|
+
expect(mockStorageService.clearUrl).toHaveBeenCalledTimes(1);
|
|
236
|
+
expect(mockRouter.navigateByUrl).toHaveBeenCalledWith('admin/users?page=0');
|
|
237
|
+
});
|
|
187
238
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
// and then call
|
|
239
|
+
it('should not navigate to the previous stored url when authentication fails', () => {
|
|
240
|
+
// WHEN
|
|
191
241
|
service.identity().subscribe();
|
|
242
|
+
httpMock.expectOne({ method: 'GET' }).error(new ErrorEvent(''));
|
|
192
243
|
|
|
193
|
-
//
|
|
194
|
-
|
|
244
|
+
// THEN
|
|
245
|
+
expect(mockStorageService.getUrl).not.toHaveBeenCalled();
|
|
246
|
+
expect(mockStorageService.clearUrl).not.toHaveBeenCalled();
|
|
247
|
+
expect(mockRouter.navigateByUrl).not.toHaveBeenCalled();
|
|
195
248
|
});
|
|
196
249
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
// GIVEN
|
|
201
|
-
sessionStorageService.retrieve = jest.fn(key => (key === 'locale' ? undefined : 'otherSessionStorageValue'));
|
|
202
|
-
|
|
203
|
-
// WHEN
|
|
204
|
-
service.identity().subscribe();
|
|
205
|
-
httpMock.expectOne({ method: 'GET' }).flush({ ...accountWithAuthorities([]), langKey: 'accountLang' });
|
|
206
|
-
|
|
207
|
-
// THEN
|
|
208
|
-
expect(mockTranslateService.use).toHaveBeenCalledWith('accountLang');
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
it('should not change language if user has changed language manually', () => {
|
|
212
|
-
// GIVEN
|
|
213
|
-
sessionStorageService.retrieve = jest.fn(key => (key === 'locale' ? 'sessionLang' : undefined));
|
|
214
|
-
|
|
215
|
-
// WHEN
|
|
216
|
-
service.identity().subscribe();
|
|
217
|
-
httpMock.expectOne({ method: 'GET' }).flush({ ...accountWithAuthorities([]), langKey: 'accountLang' });
|
|
218
|
-
|
|
219
|
-
// THEN
|
|
220
|
-
expect(mockTranslateService.use).not.toHaveBeenCalled();
|
|
221
|
-
});
|
|
222
|
-
});
|
|
250
|
+
it('should not navigate to the previous stored url when no such url exists post successful authentication', () => {
|
|
251
|
+
// GIVEN
|
|
252
|
+
mockStorageService.getUrl = jest.fn(() => null);
|
|
223
253
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
httpMock.expectOne({ method: 'GET' }).flush({});
|
|
233
|
-
|
|
234
|
-
// THEN
|
|
235
|
-
expect(mockStorageService.getUrl).toHaveBeenCalledTimes(1);
|
|
236
|
-
expect(mockStorageService.clearUrl).toHaveBeenCalledTimes(1);
|
|
237
|
-
expect(mockRouter.navigateByUrl).toHaveBeenCalledWith('admin/users?page=0');
|
|
238
|
-
});
|
|
239
|
-
|
|
240
|
-
it('should not navigate to the previous stored url when authentication fails', () => {
|
|
241
|
-
// WHEN
|
|
242
|
-
service.identity().subscribe();
|
|
243
|
-
httpMock.expectOne({ method: 'GET' }).error(new ErrorEvent(''));
|
|
244
|
-
|
|
245
|
-
// THEN
|
|
246
|
-
expect(mockStorageService.getUrl).not.toHaveBeenCalled();
|
|
247
|
-
expect(mockStorageService.clearUrl).not.toHaveBeenCalled();
|
|
248
|
-
expect(mockRouter.navigateByUrl).not.toHaveBeenCalled();
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
it('should not navigate to the previous stored url when no such url exists post successful authentication', () => {
|
|
252
|
-
// GIVEN
|
|
253
|
-
mockStorageService.getUrl = jest.fn(() => null);
|
|
254
|
-
|
|
255
|
-
// WHEN
|
|
256
|
-
service.identity().subscribe();
|
|
257
|
-
httpMock.expectOne({ method: 'GET' }).flush({});
|
|
258
|
-
|
|
259
|
-
// THEN
|
|
260
|
-
expect(mockStorageService.getUrl).toHaveBeenCalledTimes(1);
|
|
261
|
-
expect(mockStorageService.clearUrl).not.toHaveBeenCalled();
|
|
262
|
-
expect(mockRouter.navigateByUrl).not.toHaveBeenCalled();
|
|
263
|
-
});
|
|
254
|
+
// WHEN
|
|
255
|
+
service.identity().subscribe();
|
|
256
|
+
httpMock.expectOne({ method: 'GET' }).flush({});
|
|
257
|
+
|
|
258
|
+
// THEN
|
|
259
|
+
expect(mockStorageService.getUrl).toHaveBeenCalledTimes(1);
|
|
260
|
+
expect(mockStorageService.clearUrl).not.toHaveBeenCalled();
|
|
261
|
+
expect(mockRouter.navigateByUrl).not.toHaveBeenCalled();
|
|
264
262
|
});
|
|
265
263
|
});
|
|
264
|
+
});
|
|
266
265
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
266
|
+
describe('hasAnyAuthority', () => {
|
|
267
|
+
describe('hasAnyAuthority string parameter', () => {
|
|
268
|
+
it('should return false if user is not logged', () => {
|
|
269
|
+
const hasAuthority = service.hasAnyAuthority(Authority.USER);
|
|
270
|
+
expect(hasAuthority).toBe(false);
|
|
271
|
+
});
|
|
273
272
|
|
|
274
|
-
|
|
275
|
-
|
|
273
|
+
it('should return false if user is logged and has not authority', () => {
|
|
274
|
+
service.authenticate(accountWithAuthorities([Authority.USER]));
|
|
276
275
|
|
|
277
|
-
|
|
276
|
+
const hasAuthority = service.hasAnyAuthority(Authority.ADMIN);
|
|
278
277
|
|
|
279
|
-
|
|
280
|
-
|
|
278
|
+
expect(hasAuthority).toBe(false);
|
|
279
|
+
});
|
|
281
280
|
|
|
282
|
-
|
|
283
|
-
|
|
281
|
+
it('should return true if user is logged and has authority', () => {
|
|
282
|
+
service.authenticate(accountWithAuthorities([Authority.USER]));
|
|
284
283
|
|
|
285
|
-
|
|
284
|
+
const hasAuthority = service.hasAnyAuthority(Authority.USER);
|
|
286
285
|
|
|
287
|
-
|
|
288
|
-
});
|
|
286
|
+
expect(hasAuthority).toBe(true);
|
|
289
287
|
});
|
|
288
|
+
});
|
|
290
289
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
290
|
+
describe('hasAnyAuthority array parameter', () => {
|
|
291
|
+
it('should return false if user is not logged', () => {
|
|
292
|
+
const hasAuthority = service.hasAnyAuthority([Authority.USER]);
|
|
293
|
+
expect(hasAuthority).toBeFalsy();
|
|
294
|
+
});
|
|
296
295
|
|
|
297
|
-
|
|
298
|
-
|
|
296
|
+
it('should return false if user is logged and has not authority', () => {
|
|
297
|
+
service.authenticate(accountWithAuthorities([Authority.USER]));
|
|
299
298
|
|
|
300
|
-
|
|
299
|
+
const hasAuthority = service.hasAnyAuthority([Authority.ADMIN]);
|
|
301
300
|
|
|
302
|
-
|
|
303
|
-
|
|
301
|
+
expect(hasAuthority).toBe(false);
|
|
302
|
+
});
|
|
304
303
|
|
|
305
|
-
|
|
306
|
-
|
|
304
|
+
it('should return true if user is logged and has authority', () => {
|
|
305
|
+
service.authenticate(accountWithAuthorities([Authority.USER]));
|
|
307
306
|
|
|
308
|
-
|
|
307
|
+
const hasAuthority = service.hasAnyAuthority([Authority.USER, Authority.ADMIN]);
|
|
309
308
|
|
|
310
|
-
|
|
311
|
-
});
|
|
309
|
+
expect(hasAuthority).toBe(true);
|
|
312
310
|
});
|
|
313
311
|
});
|
|
314
312
|
});
|
|
@@ -23,11 +23,20 @@ import { Injectable } from '@angular/core';
|
|
|
23
23
|
})
|
|
24
24
|
export class ApplicationConfigService {
|
|
25
25
|
private endpointPrefix = '';
|
|
26
|
+
private microfrontend = false;
|
|
26
27
|
|
|
27
28
|
setEndpointPrefix(endpointPrefix: string): void {
|
|
28
29
|
this.endpointPrefix = endpointPrefix;
|
|
29
30
|
}
|
|
30
31
|
|
|
32
|
+
setMicrofrontend(microfrontend = true): void {
|
|
33
|
+
this.microfrontend = microfrontend;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
isMicrofrontend(): boolean {
|
|
37
|
+
return this.microfrontend;
|
|
38
|
+
}
|
|
39
|
+
|
|
31
40
|
getEndpointFor(api: string, microservice?: string): string {
|
|
32
41
|
if (microservice) {
|
|
33
42
|
return `${this.endpointPrefix}services/${microservice}/${api}`;
|