feat: arastirma modulleri odeme ve operasyonlari tamamla

This commit is contained in:
2026-08-09 09:24:26 +03:00
parent 4b4e00c6ee
commit 2b75e97ad6
45 changed files with 1316 additions and 330 deletions
+51
View File
@@ -0,0 +1,51 @@
import assert from "node:assert/strict";
import test from "node:test";
import { MediaType } from "@prisma/client";
import { normalizeApifyAd } from "../src/lib/apify";
import { getFeatureLimit } from "../src/lib/plans";
import { istemciIp, hizSiniriAsimi } from "../src/lib/rate-limit";
import { stripePriceFor } from "../src/lib/stripe";
test("Apify reklamı metin, medya ve ülke alanlarıyla normalize edilir", () => {
const ad = normalizeApifyAd({
adArchiveID: "123",
pageID: "page-1",
pageName: "Berber İstanbul",
adText: "Yeni stilini keşfet",
videoUrl: "https://cdn.example.com/ad.mp4",
countries: ["TR"],
adStatus: "ACTIVE"
});
assert.ok(ad);
assert.equal(ad.externalAdId, "123");
assert.equal(ad.mediaType, MediaType.VIDEO);
assert.deepEqual(ad.countries, ["TR"]);
});
test("plan feature limiti metrik adına göre çözülür", () => {
const plan = { features: { adsSearchDaily: 100, apiCreditsMonthly: 500 } } as never;
assert.equal(getFeatureLimit(plan, "ads_search_daily"), 100);
assert.equal(getFeatureLimit(plan, "api_credits_monthly"), 500);
assert.equal(getFeatureLimit(plan, "unknown"), 0);
});
test("istemci IP'sinde güvenilir son proxy adresi kullanılır", () => {
const request = new Request("https://example.com", { headers: { "x-forwarded-for": "198.51.100.1, 10.0.0.2" } });
assert.equal(istemciIp(request), "10.0.0.2");
});
test("giriş hız sınırı on birinci isteği engeller", () => {
const request = new Request("https://example.com", { headers: { "x-real-ip": `test-${Date.now()}` } });
for (let i = 0; i < 10; i += 1) assert.equal(hizSiniriAsimi(request, "giris"), null);
assert.equal(hizSiniriAsimi(request, "giris")?.status, 429);
});
test("Stripe fiyat kimliği env allowlist'inden okunur", () => {
const previous = process.env.STRIPE_PRICE_BASIC_MONTHLY;
process.env.STRIPE_PRICE_BASIC_MONTHLY = "price_test123";
assert.equal(stripePriceFor("BASIC", "monthly"), "price_test123");
process.env.STRIPE_PRICE_BASIC_MONTHLY = "invalid";
assert.throws(() => stripePriceFor("BASIC", "monthly"), /STRIPE_PRICE_NOT_CONFIGURED/);
if (previous === undefined) delete process.env.STRIPE_PRICE_BASIC_MONTHLY;
else process.env.STRIPE_PRICE_BASIC_MONTHLY = previous;
});