Skip to content

Testlash Qo'llanmasi

Payme integratsiyangizni qanday test qilishni o'rganing.

Test Muxiti

Payme ishlab chiqarish uchun test muxitini taqdim etadi:

typescript
const payme = new PaymeMerchant({
  merchantId: process.env.PAYME_MERCHANT_ID_TEST!,
  secretKey: process.env.PAYME_SECRET_KEY_TEST!,
  baseURL: 'https://checkout.test.paycom.uz/api' // Test muhiti
});

Test Kredit Ma'lumotlari

Test savdochi dashboardiga kirish uchun:

ParametrQiymat
Login (Telefon)phone
Parolqwerty
SMS Kod666666

Barcha Test Kartalar uchun SMS Kodi

Barcha test kartalar uchun SMS tasdiqlash kodi 666666. Bu kod karta turi yoki kutulgan xulq-atvordan qat'iy nazar ishlaydi.

Subscribe API Test Kartalari

Karta tokenizatsiyasi uchun test muhitida quyidagi test karta raqamlaridan foydalaning:

Karta RaqamiAmal qilish muddatiIzoh
8600 0609 2109 084203/99SMS-info ulanmagan
3333 3364 1580 465703/99Karta muddati o'tgan
4444 4459 8745 907303/99Karta bloklangan
8600 1434 1777 032303/99Noma'lum tizim xatosi
8600 1343 0184 959603/9910 soniya kechikish simulyatsiyasi (xatoda tugaydi)
8600 4954 7331 647803/99Muvaffaqiyat karta
8600 0691 9540 631103/99Muvaffaqiyat karta

Test Senariylari

  1. Muvaffaqiyat Kartalari (8600 4954 7331 6478, 8600 0691 9540 6311) - Tokenizatsiya va to'lovni muvaffaqiyatli yakunlaydi
  2. Muddati O'tgan Karta (3333 3364 1580 4657) - Muddati o'tgan kartalarni to'g'ri ishlashini tekshiring
  3. Bloklangan Karta (4444 4459 8745 9073) - Bloklangan karta xatosini ishlashini sinab ko'ring
  4. SMS Ulanmagan (8600 0609 2109 0842) - SMS tasdiqlash mavjud bo'lmaganda stsenariyni sinab ko'ring
  5. Kechikish Simulyatsiyasi (8600 1343 0184 9596) - Vaqt chegarasini ishlashini tekshiring (xatodan oldin 10 soniya kechikish)
  6. Noma'lum Xato (8600 1434 1777 0323) - Kutilmagan xatolarni ishlashini tekshiring

Unit Testlash

Mocklar bilan Testlash

typescript
import { describe, test, expect, mock } from 'bun:test';
import { PaymeMerchant } from '@joyida/payme';

describe('To\'lovni Qayta Ishlash', () => {
  test('tranzaktsiya yaratishi kerak', async () => {
    const payme = new PaymeMerchant({
      merchantId: 'test_merchant_id',
      secretKey: 'test_secret_key'
    });

    // HTTP clientni mock qilish
    const mockRpcCall = mock(() => Promise.resolve({
      create_time: Date.now(),
      transaction: '123',
      state: 1,
      receivers: null
    }));

    payme['httpClient'].rpcCall = mockRpcCall;

    const result = await payme.createTransaction({
      id: '5305e3bab097f420a62ced0b',
      time: Date.now(),
      amount: 500000,
      account: { order_id: 'ORD-123' }
    });

    expect(result.state).toBe(1);
    expect(result.transaction).toBe('123');
    expect(mockRpcCall).toHaveBeenCalled();
  });
});

Validatsiyani Testlash

typescript
import { describe, test, expect } from 'bun:test';
import { Validator, ValidationError } from '@joyida/payme';

describe('Validator', () => {
  test('summani tekshirishi kerak', () => {
    expect(() => Validator.validateAmount(500000)).not.toThrow();
    expect(() => Validator.validateAmount(-100)).toThrow(ValidationError);
    expect(() => Validator.validateAmount(0)).toThrow(ValidationError);
  });

  test('karta raqamini tekshirishi kerak', () => {
    expect(() => Validator.validateCardNumber('8600069195406311')).not.toThrow();
    expect(() => Validator.validateCardNumber('123')).toThrow(ValidationError);
  });

  test('karta muddatini tekshirishi kerak', () => {
    expect(() => Validator.validateCardExpiry('0399')).not.toThrow();
    expect(() => Validator.validateCardExpiry('1323')).toThrow(ValidationError);
  });
});

Xato Ishlashni Testlash

typescript
import { describe, test, expect } from 'bun:test';
import { PaymeError, ValidationError } from '@joyida/payme';

describe('Xato Ishlash', () => {
  test('PaymeError ni ishlashi kerak', async () => {
    const payme = new PaymeMerchant({
      merchantId: 'invalid',
      secretKey: 'invalid'
    });

    try {
      await payme.checkPerformTransaction({
        amount: 500000,
        account: { order_id: 'ORD-123' }
      });
      expect(true).toBe(false); // Bu yerga yetib kelmasligi kerak
    } catch (error) {
      expect(error).toBeInstanceOf(PaymeError);
      expect(error.code).toBe(-32504);
    }
  });

  test('ValidationError ni ishlashi kerak', () => {
    expect(() => {
      Validator.validateAmount(-100);
    }).toThrow(ValidationError);
  });
});

Integratsiya Testlash

To'lov Oqimini Testlash

typescript
import { describe, test, expect, beforeAll, afterAll } from 'bun:test';
import { PaymeMerchant, TransactionStates } from '@joyida/payme';
import { Database } from 'bun:sqlite';

describe('To\'lov Oqimi Integratsiyasi', () => {
  let db: Database;
  let payme: PaymeMerchant;

  beforeAll(() => {
    // Test ma'lumotlar bazasini sozlash
    db = new Database(':memory:');
    db.run(`
      CREATE TABLE payme_transactions (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        payme_id TEXT UNIQUE NOT NULL,
        order_id TEXT NOT NULL,
        amount INTEGER NOT NULL,
        state INTEGER NOT NULL DEFAULT 1,
        create_time INTEGER NOT NULL
      )
    `);

    // Payme klientini sozlash
    payme = new PaymeMerchant({
      merchantId: process.env.PAYME_MERCHANT_ID_TEST!,
      secretKey: process.env.PAYME_SECRET_KEY_TEST!,
      baseURL: 'https://checkout.test.paycom.uz/api'
    });
  });

  afterAll(() => {
    db.close();
  });

  test('to\'lov oqimini yakunlashi kerak', async () => {
    const orderId = `ORD-${Date.now()}`;
    const amount = 500000;
    const paymeId = generatePaymeId();

    // 1. To'lov mumkinligini tekshirish
    const check = await payme.checkPerformTransaction({
      amount,
      account: { order_id: orderId }
    });
    expect(check.allow).toBe(true);

    // 2. Tranzaktsiya yaratish
    const created = await payme.createTransaction({
      id: paymeId,
      time: Date.now(),
      amount,
      account: { order_id: orderId }
    });
    expect(created.state).toBe(1);

    // 3. Ma'lumotlar bazasiga saqlash
    db.run(`
      INSERT INTO payme_transactions
      (payme_id, order_id, amount, state, create_time)
      VALUES (?, ?, ?, ?, ?)
    `, [paymeId, orderId, amount, created.state, created.create_time]);

    // 4. Tranzaktsiyani bajarish
    const performed = await payme.performTransaction({
      id: paymeId
    });
    expect(performed.state).toBe(TransactionStates.COMPLETED);

    // 5. Ma'lumotlar bazasida tasdiqlash
    const dbTransaction = db.query(`
      SELECT * FROM payme_transactions WHERE payme_id = ?
    `).get(paymeId);
    expect(dbTransaction).toBeDefined();
    expect(dbTransaction.order_id).toBe(orderId);
  });
});

Karta Tokenizatsiyasini Testlash

typescript
import { describe, test, expect } from 'bun:test';
import { PaymeSubscribe } from '@joyida/payme';

describe('Karta Tokenizatsiyasi', () => {
  test('kartani tokenizatsiya qilishi kerak', async () => {
    const subscribeClient = new PaymeSubscribe({
      merchantId: process.env.PAYME_MERCHANT_ID_TEST!
    }, 'client');

    // Karta tokenini yaratish
    const created = await subscribeClient.cardsCreate({
      card: {
        number: '8600069195406311',
        expire: '0399'
      },
      save: true
    });

    expect(created.card.token).toBeDefined();
    expect(created.card.verify).toBe(false);

    // SMS kod so'rash
    const sms = await subscribeClient.cardsGetVerifyCode({
      token: created.card.token
    });

    expect(sms.sent).toBe(true);
    expect(sms.phone).toBeDefined();

    // Kartani tasdiqlash (test kodidan foydalanish)
    const verified = await subscribeClient.cardsVerify({
      token: created.card.token,
      code: '666666' // Test kodi
    });

    expect(verified.card.verify).toBe(true);
  });
});

Qo'lda Testlash

Test Kontrol Ro'yxati

  • [ ] Tranzaktsiya yaratish
  • [ ] Tranzaktsiyani bajarish
  • [ ] Perform dan oldin tranzaktsiyani bekor qilish
  • [ ] Perform dan keyin tranzaktsiyani bekor qilish (qaytarish)
  • [ ] Tranzaktsiya holatini tekshirish
  • [ ] Hisobnatishni olish
  • [ ] Karta tokenini yaratish
  • [ ] Kartani tasdiqlash
  • [ ] Karta holatini tekshirish
  • [ ] Karta tokenini o'chirish
  • [ ] Chek yaratish
  • [ ] Chek to'lash
  • [ ] Chek SMS yuborish
  • [ ] Chekni bekor qilish
  • [ ] Chek tafsilotlarini olish

Test Skripti

typescript
import { PaymeMerchant, PaymeSubscribe } from '@joyida/payme';

async function runTests() {
  const payme = new PaymeMerchant({
    merchantId: process.env.PAYME_MERCHANT_ID_TEST!,
    secretKey: process.env.PAYME_SECRET_KEY_TEST!,
    baseURL: 'https://checkout.test.paycom.uz/api'
  });

  console.log('🧪 Payme integratsiya testlarini ishga tushirish...\n');

  // Test 1: Performni tekshirish
  console.log('1️⃣ CheckPerformTransaction ni testlash...');
  try {
    const check = await payme.checkPerformTransaction({
      amount: 500000,
      account: { order_id: 'TEST-001' }
    });
    console.log('✅ CheckPerformTransaction:', check.allow);
  } catch (error) {
    console.error('❌ CheckPerformTransaction muvaffaqiyatsiz:', error.message);
  }

  // Test 2: Tranzaktsiya yaratish
  console.log('\n2️⃣ CreateTransaction ni testlash...');
  const paymeId = generatePaymeId();
  try {
    const created = await payme.createTransaction({
      id: paymeId,
      time: Date.now(),
      amount: 500000,
      account: { order_id: 'TEST-001' }
    });
    console.log('✅ CreateTransaction:', created.state);
  } catch (error) {
    console.error('❌ CreateTransaction muvaffaqiyatsiz:', error.message);
  }

  // Test 3: Tranzaktsiyani bajarish
  console.log('\n3️⃣ PerformTransaction ni testlash...');
  try {
    const performed = await payme.performTransaction({
      id: paymeId
    });
    console.log('✅ PerformTransaction:', performed.state);
  } catch (error) {
    console.error('❌ PerformTransaction muvaffaqiyatsiz:', error.message);
  }

  // Test 4: Tranzaktsiyani tekshirish
  console.log('\n4️⃣ CheckTransaction ni testlash...');
  try {
    const status = await payme.checkTransaction({
      id: paymeId
    });
    console.log('✅ CheckTransaction:', status.state);
  } catch (error) {
    console.error('❌ CheckTransaction muvaffaqiyatsiz:', error.message);
  }

  console.log('\n✅ Barcha testlar yakunlandi!');
}

runTests();

Unumdorlik Testlash

Yuklama Testlash

typescript
import { PaymeMerchant } from '@joyida/payme';

async function loadTest(concurrency: number, requests: number) {
  const payme = new PaymeMerchant({
    merchantId: process.env.PAYME_MERCHANT_ID_TEST!,
    secretKey: process.env.PAYME_SECRET_KEY_TEST!
  });

  const startTime = Date.now();
  const promises = [];

  for (let i = 0; i < requests; i++) {
    promises.push(
      payme.checkPerformTransaction({
        amount: 500000,
        account: { order_id: `TEST-${i}` }
      })
    );

    // Concurrencyni boshqarish
    if (promises.length >= concurrency) {
      await Promise.all(promises);
      promises.length = 0;
    }
  }

  // Qolgan so'rovlarni kutish
  if (promises.length > 0) {
    await Promise.all(promises);
  }

  const endTime = Date.now();
  const duration = endTime - startTime;
  const rps = (requests / duration) * 1000;

  console.log(`${requests} ta so'rov ${duration}ms da yakunlandi`);
  console.log(`O'rtacha: ${rps.toFixed(2)} so'rov/soniya`);
}

// Yuklama testini ishga tushirish
loadTest(10, 100); // 10 ta concurrent so'rov, 100 ta jami

Eng Yaxshi Amaliyotlar

✅ Kerakli ishlar

  1. Ishlab chiqarish uchun test muhitidan foydalaning
  2. Barcha xato stsenariylarini testing
  3. Turli karta raqamlari bilan testing
  4. Vaqt tugashi ishlashini testing
  5. Idempotentlikni testing
  6. Ma'lumotlar bazasi integratsiyasini testing
  7. Ishga tushirishdan oldin integratsiya testlarini o'tkazing

❌ Kerakli emaslar

  1. Ishlab chiqarishda testing qilmang
  2. Xato testingni o'tkazib yubormang
  3. Vaqt tugashi testlarini e'tiborsiz qoldirmang
  4. Bekor qilish testingni unutmang
  5. Validatsiya testlarini o'tkazib yubormang

Keyingi Qadamlar

MIT Lizenziyasi ostida chiqarilgan.