Files

205 lines
7.0 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Vitrin İstanbul'da; test işçisi farklı saat diliminde koşarsa gün/saat
// hesabı kayar. Beklentileri ortama bağımlı bırakmamak için TZ sabitlenir.
process.env.TZ = 'Europe/Istanbul';
import { describe, it, expect } from 'vitest';
import { kurlariGetir, kurGetir, trendHesapla, fiyatFormatla, kurHareketiniSimuleEt } from '../data/kurlar.js';
import { iletisimFormuDogrula, bugunAcikMi, ISLETME, CALISMA_SAATLERI } from '../data/iletisim.js';
describe('trendHesapla', () => {
it('pozitif değişimi artis döner', () => {
expect(trendHesapla(0.5)).toBe('artis');
});
it('negatif değişimi dusus döner', () => {
expect(trendHesapla(-0.2)).toBe('dusus');
});
it('sıfır değişimi sabit döner', () => {
expect(trendHesapla(0)).toBe('sabit');
});
it('geçersiz değerde sabit döner', () => {
expect(trendHesapla('abc')).toBe('sabit');
expect(trendHesapla(undefined)).toBe('sabit');
});
});
describe('fiyatFormatla', () => {
it('Türkçe biçimde virgüllü fiyat üretir', () => {
expect(fiyatFormatla(41.28)).toBe('41,28 ₺');
});
it('binlik ayırıcıyı uygular', () => {
expect(fiyatFormatla(3950)).toContain('3.950');
});
it('geçersiz değerde tire döner', () => {
expect(fiyatFormatla('abc')).toBe('-');
});
});
describe('kurlariGetir', () => {
it('en az 6 kur kaydı döner', () => {
expect(kurlariGetir().length).toBeGreaterThanOrEqual(6);
});
it('her kayıtta trend ve metin alanları hesaplanır', () => {
for (const kur of kurlariGetir()) {
expect(['artis', 'dusus', 'sabit']).toContain(kur.trend);
expect(typeof kur.alisMetin).toBe('string');
expect(typeof kur.satisMetin).toBe('string');
}
});
it('satış fiyatı alış fiyatından küçük olmaz', () => {
for (const kur of kurlariGetir()) {
expect(kur.satis).toBeGreaterThanOrEqual(kur.alis);
}
});
});
describe('kurGetir', () => {
it('kodu büyük/küçük harf duyarsız bulur', () => {
expect(kurGetir('usd').kod).toBe('USD');
expect(kurGetir('USD').kod).toBe('USD');
});
it('olmayan kod için null döner', () => {
expect(kurGetir('XYZ')).toBeNull();
expect(kurGetir(null)).toBeNull();
});
});
describe('kurHareketiniSimuleEt', () => {
it('kurları döner ve değişim değerleri sayı kalır', () => {
const sonuc = kurHareketiniSimuleEt();
expect(sonuc.length).toBeGreaterThanOrEqual(6);
for (const kur of sonuc) {
expect(typeof kur.degisim).toBe('number');
expect(Number.isFinite(kur.degisim)).toBe(true);
}
});
});
describe('iletisimFormuDogrula', () => {
it('tam geçerli formu onaylar', () => {
const sonuc = iletisimFormuDogrula({
ad: 'Ahmet Yılmaz',
telefon: '0500 000 00 33',
eposta: 'a@ornek.com',
mesaj: 'Bilgi almak istiyorum, teşekkürler.'
});
expect(sonuc.gecerli).toBe(true);
expect(sonuc.hatalar).toEqual({});
});
it('kısa adı reddeder', () => {
const sonuc = iletisimFormuDogrula({ ad: 'Al', telefon: '05000000033', mesaj: 'Yeterince uzun bir mesaj.' });
expect(sonuc.gecerli).toBe(false);
expect(sonuc.hatalar.ad).toBeTruthy();
});
it('geçersiz telefonu reddeder', () => {
const sonuc = iletisimFormuDogrula({ ad: 'Ahmet Yılmaz', telefon: '12345', mesaj: 'Yeterince uzun bir mesaj.' });
expect(sonuc.gecerli).toBe(false);
expect(sonuc.hatalar.telefon).toBeTruthy();
});
it('05xx, 5xx ve +90 biçimlerini kabul eder', () => {
const temel = { ad: 'Ahmet Yılmaz', mesaj: 'Yeterince uzun bir mesaj.' };
expect(iletisimFormuDogrula({ ...temel, telefon: '05000000033' }).gecerli).toBe(true);
expect(iletisimFormuDogrula({ ...temel, telefon: '5000000033' }).gecerli).toBe(true);
expect(iletisimFormuDogrula({ ...temel, telefon: '+905000000033' }).gecerli).toBe(true);
});
it('e-posta opsiyoneldir ama girildiyse geçerli olmalı', () => {
const temel = { ad: 'Ahmet Yılmaz', telefon: '05000000033', mesaj: 'Yeterince uzun bir mesaj.' };
expect(iletisimFormuDogrula(temel).gecerli).toBe(true);
expect(iletisimFormuDogrula({ ...temel, eposta: 'bozuk' }).gecerli).toBe(false);
});
it('boş veriyle çağrıldığında çökmez ve hata döner', () => {
const sonuc = iletisimFormuDogrula();
expect(sonuc.gecerli).toBe(false);
expect(Object.keys(sonuc.hatalar).length).toBeGreaterThan(0);
});
});
describe('bugunAcikMi', () => {
/**
* NOT: Vitest testleri işçi sürecinde koşar ve bu süreçte saat dilimi UTC
* olabilir. Bu yüzden hedef günü önce bulup, o günün tarihini ÜRETEREK
* kuruyoruz — sabit tarih yazmak ortama bağımlı kırılganlık yaratıyordu.
* @param {number} hedefGun 0=Pazar ... 6=Cumartesi
* @param {number} saat
* @param {number} dakika
* @returns {Date}
*/
function gunTarihi(hedefGun, saat = 12, dakika = 0) {
const d = new Date(2026, 2, 1, saat, dakika, 0); // 1 Mart 2026
const fark = (hedefGun - d.getDay() + 7) % 7;
return new Date(2026, 2, 1 + fark, saat, dakika, 0);
}
it('çalışma saatleri haftanın 7 gününü kapsar', () => {
expect(CALISMA_SAATLERI.length).toBe(7);
});
it('Pazar günü kapalı döner', () => {
const pazar = gunTarihi(0);
expect(pazar.getDay()).toBe(0); // test ön kabulü
const sonuc = bugunAcikMi(pazar);
expect(sonuc.acik).toBe(false);
expect(sonuc.acilis).toBeNull();
});
it('hafta içi öğle saatinde açık döner', () => {
const pazartesi = gunTarihi(1);
expect(pazartesi.getDay()).toBe(1); // test ön kabulü
const sonuc = bugunAcikMi(pazartesi);
expect(sonuc.acik).toBe(true);
expect(sonuc.gun).toBe('Pazartesi');
});
it('Cumartesi 17:00 açık, 18:30 kapalı döner (kısa gün)', () => {
const cumartesiErken = gunTarihi(6, 17, 0);
const cumartesiGeç = gunTarihi(6, 18, 30);
expect(cumartesiErken.getDay()).toBe(6);
expect(bugunAcikMi(cumartesiErken).acik).toBe(true);
expect(bugunAcikMi(cumartesiGeç).acik).toBe(false);
});
it('gece saatinde kapalı döner', () => {
const pazartesiGece = gunTarihi(1, 23, 30);
expect(bugunAcikMi(pazartesiGece).acik).toBe(false);
});
it('açılış saatinden hemen önce kapalı döner', () => {
const erken = gunTarihi(1, 8, 0);
expect(bugunAcikMi(erken).acik).toBe(false);
});
it('kapanış saatinde kapalı döner (yarı açık aralık)', () => {
const kapanis = gunTarihi(1, 19, 30);
expect(bugunAcikMi(kapanis).acik).toBe(false);
});
});
describe('İşletme bilgileri', () => {
it('telefon numarası müşterinin verdiği numarayla eşleşir', () => {
expect(ISLETME.telefon.gorunur.replace(/\s/g, '')).toBe('05000000000');
});
it('tel: bağlantısı uluslararası biçimde', () => {
expect(ISLETME.telefon.arama).toBe('+905000000000');
});
it('adres Merkez/İstanbul içerir', () => {
expect(ISLETME.adres.tam).toContain('Merkez');
expect(ISLETME.adres.tam).toContain('İstanbul');
expect(ISLETME.adres.tam).toContain('Örnek Mahallesi');
expect(ISLETME.adres.tam).toContain('Çarşı Caddesi');
});
});