diff --git a/packages/common/test/directives/ng_optimized_image_spec.ts b/packages/common/test/directives/ng_optimized_image_spec.ts
index 08e37001ccc..0cfb640220e 100644
--- a/packages/common/test/directives/ng_optimized_image_spec.ts
+++ b/packages/common/test/directives/ng_optimized_image_spec.ts
@@ -8,12 +8,12 @@
import {CommonModule, DOCUMENT} from '@angular/common';
import {RuntimeErrorCode} from '@angular/common/src/errors';
-import {Component, Provider} from '@angular/core';
+import {Component, Provider, Type} from '@angular/core';
import {ComponentFixture, TestBed} from '@angular/core/testing';
import {expect} from '@angular/platform-browser/testing/src/matchers';
import {withHead} from '@angular/private/testing';
-import {IMAGE_LOADER, ImageLoader, ImageLoaderConfig} from '../../src/directives/ng_optimized_image/image_loaders/image_loader';
+import {createImageLoader, IMAGE_LOADER, ImageLoader, ImageLoaderConfig} from '../../src/directives/ng_optimized_image/image_loaders/image_loader';
import {ABSOLUTE_SRCSET_DENSITY_CAP, assertValidNgSrcset, NgOptimizedImage, RECOMMENDED_SRCSET_DENSITY_CAP} from '../../src/directives/ng_optimized_image/ng_optimized_image';
import {PRECONNECT_CHECK_BLOCKLIST} from '../../src/directives/ng_optimized_image/preconnect_link_checker';
@@ -865,6 +865,32 @@ describe('Image directive', () => {
expect(img.src).toBe(`${IMG_BASE_URL}/img.png`);
});
+ it(`should allow providing image loaders via Component providers`, withHead('', () => {
+ const createImgUrl = (path: string, config: ImageLoaderConfig) => `${path}/${config.src}`;
+ const loaderWithPath = createImageLoader(createImgUrl);
+
+ @Component({
+ selector: 'test-cmp',
+ template: '
',
+ providers: [loaderWithPath('https://component.io')]
+ })
+ class TestComponent {
+ }
+
+ setupTestingModule(
+ {component: TestComponent, extraProviders: [loaderWithPath('https://default.io')]});
+
+ const fixture = TestBed.createComponent(TestComponent);
+ fixture.detectChanges();
+
+ const defaultLoader = TestBed.inject(IMAGE_LOADER);
+ const nativeElement = fixture.nativeElement as HTMLElement;
+ const img = nativeElement.querySelector('img')!;
+
+ expect(defaultLoader({src: 'a.png'})).toBe('https://default.io/a.png');
+ expect(img.src).toBe('https://component.io/a.png');
+ }));
+
describe('`ngSrcset` values', () => {
let imageLoader!: ImageLoader;
@@ -1033,7 +1059,8 @@ class TestComponent {
priority = false;
}
-function setupTestingModule(config?: {imageLoader?: ImageLoader, extraProviders?: any[]}) {
+function setupTestingModule(
+ config?: {imageLoader?: ImageLoader, extraProviders?: Provider[], component?: Type}) {
const defaultLoader = (config: ImageLoaderConfig) => {
const isAbsolute = /^https?:\/\//.test(config.src);
return isAbsolute ? config.src : window.location.origin + '/' + config.src;
@@ -1047,7 +1074,7 @@ function setupTestingModule(config?: {imageLoader?: ImageLoader, extraProviders?
];
TestBed.configureTestingModule({
- declarations: [TestComponent],
+ declarations: [config?.component ?? TestComponent],
// Note: the `NgOptimizedImage` directive is experimental and is not a part of the
// `CommonModule` yet, so it's imported separately.
imports: [CommonModule, NgOptimizedImage],