Skip to content

Commit 890e185

Browse files
Correction du backlink quand l'url est mal définie (#2060)
* debug backlink * Add more test cases * Add tests * Disable cache control * Add font * fix test * fix test * Remove random settings
1 parent 159a008 commit 890e185

File tree

8 files changed

+104
-36
lines changed

8 files changed

+104
-36
lines changed

core/views.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,26 @@
44
from django.contrib.staticfiles import finders
55
from django.http import HttpResponse
66
from django.template.loader import render_to_string
7-
from django.utils.safestring import mark_safe
87
from django.views.decorators.cache import cache_control
8+
from wagtail.templatetags.wagtailcore_tags import richtext
99

1010
from qfdmd.models import EmbedSettings
1111

1212

13-
@cache_control(max_age=3600) # an hour
1413
def backlink(request):
1514
key = request.GET.get("key")
1615
text_content = ""
17-
if key == "assistant":
18-
text_content = EmbedSettings.objects.first().backlink_assistant
19-
if key == "carte":
20-
text_content = EmbedSettings.objects.first().backlink_carte
21-
if key == "formulaire":
22-
text_content = EmbedSettings.objects.first().backlink_formulaire
23-
24-
return HttpResponse(mark_safe(text_content), content_type="text/plain")
16+
try:
17+
if key == "assistant":
18+
text_content = EmbedSettings.objects.first().backlink_assistant
19+
if key == "carte":
20+
text_content = EmbedSettings.objects.first().backlink_carte
21+
if key == "formulaire":
22+
text_content = EmbedSettings.objects.first().backlink_formulaire
23+
except (AttributeError, EmbedSettings.DoesNotExist):
24+
pass
25+
26+
return HttpResponse(richtext(text_content), content_type="text/plain")
2527

2628

2729
@cache_control(max_age=31536000)
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import pytest
2+
from factory.django import DjangoModelFactory
3+
4+
from qfdmd.models import EmbedSettings
5+
6+
7+
class EmbedSettingsFactory(DjangoModelFactory):
8+
class Meta:
9+
model = EmbedSettings
10+
11+
12+
@pytest.mark.django_db
13+
def test_backlink_assistant(client):
14+
EmbedSettingsFactory(backlink_assistant="coucou")
15+
response = client.get("/embed/backlink?key=assistant")
16+
assert response.content.decode() == "coucou"
17+
18+
19+
@pytest.mark.django_db
20+
def test_backlink_carte(client):
21+
EmbedSettingsFactory(backlink_carte="coucou")
22+
response = client.get("/embed/backlink?key=carte")
23+
assert response.content.decode() == "coucou"
24+
25+
26+
@pytest.mark.django_db
27+
def test_backlink_formulaire(client):
28+
EmbedSettingsFactory(backlink_formulaire="coucou")
29+
response = client.get("/embed/backlink?key=formulaire")
30+
assert response.content.decode() == "coucou"
31+
32+
33+
@pytest.mark.django_db
34+
def test_backlink_random(client):
35+
EmbedSettingsFactory(
36+
backlink_carte="coucou", backlink_assistant="youpi", backlink_formulaire="super"
37+
)
38+
response = client.get("/embed/backlink?key=random")
39+
assert response.content.decode() == ""
40+
41+
42+
@pytest.mark.django_db
43+
def test_backlink_without_settings(client):
44+
response = client.get("/embed/backlink?key=assistant")
45+
assert response.content.decode() == ""
46+
47+
response = client.get("/embed/backlink?key=formulaire")
48+
assert response.content.decode() == ""
49+
50+
response = client.get("/embed/backlink?key=carte")
51+
assert response.content.decode() == ""

jest.config.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
11
import type { Config } from "jest"
22

33
const config: Config = {
4-
preset: "ts-jest",
5-
testEnvironment: "jsdom",
6-
testEnvironmentOptions: {
7-
html: '<html lang="zh-cmn-Hant"></html>',
8-
url: "https://jestjs.io/",
9-
userAgent: "Agent/007",
10-
},
11-
transform: {
12-
"^.+\\.ts?$": "ts-jest",
13-
},
14-
transformIgnorePatterns: ["/node_modules/(?!crypto-random-string)(.*)"],
4+
preset: "ts-jest",
5+
testEnvironment: "jsdom",
6+
verbose: false,
7+
transform: {
8+
"^.+\\.ts?$": "ts-jest",
9+
},
1510
}
1611

1712
export default config

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,4 @@
8383
"optionalDependencies": {
8484
"@parcel/watcher-linux-x64-glibc": "^2.5.1"
8585
}
86-
}
86+
}

static/to_compile/embed/assistant.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ import { generateBackLink } from "./helpers"
66
const script = document.currentScript as HTMLScriptElement
77
const slug = script?.dataset?.objet
88
const epci = script?.dataset?.epci
9-
let origin = new URL(script?.getAttribute("src")).origin
9+
let baseUrl = new URL(script?.getAttribute("src")).origin
1010

1111
if (process.env.BASE_URL) {
12-
origin = process.env.BASE_URL
12+
baseUrl = process.env.BASE_URL
1313
}
1414

1515
async function initScript() {
16-
const parts = [origin]
16+
const parts = [baseUrl]
1717
const iframeResizerOptions: iframeResizer.IFramePageOptions = {
1818
license: "GPLv3",
1919
id: "quefairedemesdechets-assistant",
@@ -53,7 +53,7 @@ async function initScript() {
5353
}
5454

5555
script.parentNode?.insertBefore(iframe, script)
56-
await generateBackLink(iframe, "assistant")
56+
await generateBackLink(iframe, "assistant", baseUrl)
5757
iframe.onload = () => {
5858
iframeResize(iframeResizerOptions, iframe)
5959
}

static/to_compile/embed/helpers.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
11
export type BacklinkKey = "assistant" | "carte" | "formulaire"
2-
export async function generateBackLink(iframe: HTMLIFrameElement, key: BacklinkKey) {
2+
export async function generateBackLink(
3+
iframe: HTMLIFrameElement,
4+
key: BacklinkKey,
5+
baseUrl?: string | null,
6+
) {
7+
if (!baseUrl) {
8+
console.error("Origin is not defined or is empty")
9+
return
10+
}
11+
312
const backlinkTag = document.createElement("div")
413
backlinkTag.setAttribute(
514
"style",
6-
"font-size: 0.9rem; text-align: center; padding-top: 0.5rem;",
15+
"font-family: system-ui; font-size: 0.9rem; text-align: center; padding-top: 0.5rem;",
716
)
17+
818
let backlinkContent = ""
919
try {
10-
const req = await fetch(`${origin}/embed/backlink?key=${key}`)
20+
const req = await fetch(`${baseUrl}/embed/backlink?key=${key}`)
1121
backlinkContent = await req.text()
1222
backlinkTag.innerHTML = backlinkContent
1323
iframe.insertAdjacentElement("afterend", backlinkTag)

static/to_compile/js/iframe_functions.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ export async function buildAndInsertIframeFrom(
3535
backlinkKey: BacklinkKey,
3636
) {
3737
const iframe = document.createElement("iframe")
38-
await generateBackLink(iframe, backlinkKey)
38+
const baseUrl = new URL(scriptTag.getAttribute("src")!).origin
39+
await generateBackLink(iframe, backlinkKey, baseUrl)
3940
for (var key in iframeAttributes) {
4041
iframe.setAttribute(key, iframeAttributes[key])
4142
}
@@ -53,7 +54,7 @@ export function getIframeAttributesAndExtra(
5354
let maxWidth = options?.maxWidth || "100%"
5455
let height = "700px"
5556
let route = baseRoute
56-
const BASE_URL = new URL(scriptTag.getAttribute("src")!).origin
57+
const baseUrl = new URL(scriptTag.getAttribute("src")!).origin
5758
const urlParams = new URLSearchParams()
5859

5960
let iframeExtraAttributes: { [Property in keyof HTMLScriptElement]?: unknown } = {}
@@ -89,7 +90,7 @@ export function getIframeAttributesAndExtra(
8990
}
9091

9192
const iframeAttributes = compileIframeAttributes(
92-
BASE_URL,
93+
baseUrl,
9394
urlParams,
9495
maxWidth,
9596
height,

static/to_compile/tests/iframe_functions.test.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,20 @@ describe("generateBackLink", () => {
1414
jest.restoreAllMocks()
1515
})
1616

17-
it("should not exit when fetch fails and logs an error message", async () => {
18-
global.fetch = jest.fn(() => Promise.reject(new Error("Network Error")))
19-
const key: BacklinkKey = "carte"
17+
it("should log an error and not proceed when origin is undefined or empty", async () => {
18+
console.error = jest.fn() // Mock console.error to track errors
2019

21-
await generateBackLink(iframeMock, key)
20+
// Test for undefined origin
21+
await generateBackLink(iframeMock, "carte", undefined)
22+
expect(console.error).toHaveBeenCalledWith("Origin is not defined or is empty")
23+
24+
// Test for empty string origin
25+
await generateBackLink(iframeMock, "carte", "")
26+
expect(console.error).toHaveBeenCalledWith("Origin is not defined or is empty")
27+
28+
// Test for null origin
29+
await generateBackLink(iframeMock, "carte", null)
30+
expect(console.error).toHaveBeenCalledWith("Origin is not defined or is empty")
2231
})
2332
})
2433

0 commit comments

Comments
 (0)