mirror of
https://github.com/maziggy/bambuddy.git
synced 2026-10-18 21:47:39 +02:00
implemented pr feedback #2
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
*/
|
||||
|
||||
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
||||
import { renderHook, waitFor, act } from '@testing-library/react';
|
||||
import { renderHook, waitFor, act, screen } from '@testing-library/react';
|
||||
import React from 'react';
|
||||
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
||||
import { ToastProvider } from '../../contexts/ToastContext';
|
||||
@@ -23,6 +23,10 @@ vi.mock('react-i18next', () => ({
|
||||
const { printer, slots } = options as { printer: string; slots: string };
|
||||
return `Missing assignments for ${printer}: ${slots}`;
|
||||
}
|
||||
if (key === 'printers.toast.killSwitchTriggered' && options) {
|
||||
const { printer, filename } = options as { printer: string; filename: string };
|
||||
return `Billing kill switch stopped ${filename} on ${printer}`;
|
||||
}
|
||||
return key;
|
||||
},
|
||||
i18n: {},
|
||||
@@ -490,6 +494,28 @@ describe('useWebSocket hook', () => {
|
||||
vi.unstubAllGlobals();
|
||||
});
|
||||
|
||||
it('shows an error toast when the billing kill switch stops a print', async () => {
|
||||
const { useWebSocket } = await import('../../hooks/useWebSocket');
|
||||
|
||||
renderHook(() => useWebSocket(), {
|
||||
wrapper: createWrapper(queryClient),
|
||||
});
|
||||
|
||||
const ws = await waitForWs();
|
||||
act(() => {
|
||||
ws.open();
|
||||
ws.simulateMessage({
|
||||
type: 'kill_switch_triggered',
|
||||
printer_id: 7,
|
||||
printer_name: 'Printer B',
|
||||
filename: 'foreign_job.3mf',
|
||||
});
|
||||
});
|
||||
|
||||
const toast = screen.getByText('Billing kill switch stopped foreign_job.3mf on Printer B');
|
||||
expect(toast.parentElement).toHaveClass('bg-red-500/10');
|
||||
});
|
||||
|
||||
it('handles spool_assignment_verified messages (success and failure) without error', async () => {
|
||||
const { useWebSocket } = await import('../../hooks/useWebSocket');
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ interface WebSocketMessage {
|
||||
printer_id?: number;
|
||||
data?: Record<string, unknown>;
|
||||
printer_name?: string;
|
||||
filename?: string;
|
||||
missing_slots?: Array<{ slot?: string }>;
|
||||
// Spool-assignment read-back verification (#2582).
|
||||
slot?: string;
|
||||
@@ -338,6 +339,13 @@ export function useWebSocket() {
|
||||
debouncedInvalidate('archiveStats');
|
||||
break;
|
||||
|
||||
case 'kill_switch_triggered': {
|
||||
const printer = message.printer_name || `Printer ${message.printer_id ?? '?'}`;
|
||||
const filename = message.filename || t('common.unknown');
|
||||
showToast(t('printers.toast.killSwitchTriggered', { printer, filename }), 'error');
|
||||
break;
|
||||
}
|
||||
|
||||
case 'archive_created':
|
||||
debouncedInvalidate('archives');
|
||||
debouncedInvalidate('archiveStats');
|
||||
|
||||
@@ -447,6 +447,7 @@ export default {
|
||||
toast: {
|
||||
printerDeleted: 'Drucker gelöscht',
|
||||
missingSpoolAssignment: 'Druck gestartet auf {{printer}}. Fehlende Spulenzuordnung für: {{slots}}',
|
||||
killSwitchTriggered: 'Der Billing-Kill-Switch hat einen nicht autorisierten Druck auf {{printer}} gestoppt: {{filename}}',
|
||||
assignmentVerified: 'Filament in Slot {{slot}} geladen ({{printer}})',
|
||||
assignmentVerifiedNoKprofile: 'Slot {{slot}} auf {{printer}} geladen, aber das Fluss-Kalibrierungsprofil (K-Profil) wurde nicht übernommen',
|
||||
assignmentNotConfirmed: 'Zuordnung für Slot {{slot}} auf {{printer}} konnte nicht bestätigt werden – bitte den AMS-Slot prüfen',
|
||||
|
||||
@@ -450,6 +450,7 @@ export default {
|
||||
toast: {
|
||||
printerDeleted: 'Printer deleted',
|
||||
missingSpoolAssignment: 'Print started on {{printer}}. Missing spool assignment for: {{slots}}',
|
||||
killSwitchTriggered: 'The billing kill switch stopped an unauthorized print on {{printer}}: {{filename}}',
|
||||
assignmentVerified: 'Filament loaded on slot {{slot}} ({{printer}})',
|
||||
assignmentVerifiedNoKprofile: 'Slot {{slot}} on {{printer}} loaded, but the flow calibration (K-profile) was not applied',
|
||||
assignmentNotConfirmed: 'Could not confirm the assignment for slot {{slot}} on {{printer}} — check the AMS slot',
|
||||
|
||||
@@ -447,6 +447,7 @@ export default {
|
||||
toast: {
|
||||
printerDeleted: 'Impresora eliminada',
|
||||
missingSpoolAssignment: 'Impresión iniciada en {{printer}}. Falta la asignación de bobina para: {{slots}}',
|
||||
killSwitchTriggered: 'El interruptor de seguridad de facturación detuvo una impresión no autorizada en {{printer}}: {{filename}}',
|
||||
assignmentVerified: 'Filamento cargado en la ranura {{slot}} ({{printer}})',
|
||||
assignmentVerifiedNoKprofile: 'Ranura {{slot}} en {{printer}} cargada, pero no se aplicó el perfil de calibración de flujo (perfil K)',
|
||||
assignmentNotConfirmed: 'No se pudo confirmar la asignación de la ranura {{slot}} en {{printer}}: revisa la ranura AMS',
|
||||
|
||||
@@ -447,6 +447,7 @@ export default {
|
||||
toast: {
|
||||
printerDeleted: 'Imprimante supprimée',
|
||||
missingSpoolAssignment: 'Impression démarrée sur {{printer}}. Attribution de bobine manquante pour : {{slots}}',
|
||||
killSwitchTriggered: 'Le coupe-circuit de facturation a arrêté une impression non autorisée sur {{printer}} : {{filename}}',
|
||||
assignmentVerified: 'Filament chargé dans l\'emplacement {{slot}} ({{printer}})',
|
||||
assignmentVerifiedNoKprofile: 'Emplacement {{slot}} sur {{printer}} chargé, mais le profil de calibration de débit (profil K) n\'a pas été appliqué',
|
||||
assignmentNotConfirmed: 'Impossible de confirmer l\'attribution de l\'emplacement {{slot}} sur {{printer}} — vérifiez l\'emplacement AMS',
|
||||
|
||||
@@ -447,6 +447,7 @@ export default {
|
||||
toast: {
|
||||
printerDeleted: 'Stampante eliminata',
|
||||
missingSpoolAssignment: 'Stampa avviata su {{printer}}. Mancano assegnazioni bobina per: {{slots}}',
|
||||
killSwitchTriggered: 'L’interruttore di sicurezza della fatturazione ha arrestato una stampa non autorizzata su {{printer}}: {{filename}}',
|
||||
assignmentVerified: 'Filamento caricato nello slot {{slot}} ({{printer}})',
|
||||
assignmentVerifiedNoKprofile: 'Slot {{slot}} su {{printer}} caricato, ma il profilo di calibrazione del flusso (profilo K) non è stato applicato',
|
||||
assignmentNotConfirmed: 'Impossibile confermare l\'assegnazione dello slot {{slot}} su {{printer}} — controlla lo slot AMS',
|
||||
|
||||
@@ -446,6 +446,7 @@ export default {
|
||||
toast: {
|
||||
printerDeleted: 'プリンターを削除しました',
|
||||
missingSpoolAssignment: '{{printer}}で印刷を開始しました。以下のスプール割り当てがありません: {{slots}}',
|
||||
killSwitchTriggered: '課金キルスイッチが{{printer}}で未承認の印刷を停止しました:{{filename}}',
|
||||
assignmentVerified: 'スロット{{slot}}にフィラメントを読み込みました({{printer}})',
|
||||
assignmentVerifiedNoKprofile: '{{printer}}のスロット{{slot}}を読み込みましたが、フロー校正プロファイル(Kプロファイル)は適用されませんでした',
|
||||
assignmentNotConfirmed: '{{printer}}のスロット{{slot}}の割り当てを確認できませんでした。AMSスロットを確認してください',
|
||||
|
||||
@@ -421,6 +421,7 @@ export default {
|
||||
toast: {
|
||||
printerDeleted: '프린터가 삭제되었습니다',
|
||||
missingSpoolAssignment: '{{printer}}에서 인쇄가 시작되었습니다. 슬롯 할당 누락: {{slots}}',
|
||||
killSwitchTriggered: '결제 킬 스위치가 {{printer}}에서 승인되지 않은 인쇄를 중지했습니다: {{filename}}',
|
||||
assignmentVerified: '슬롯 {{slot}}에 필라멘트가 로드되었습니다 ({{printer}})',
|
||||
assignmentVerifiedNoKprofile: '{{printer}}의 슬롯 {{slot}}이(가) 로드되었지만 유량 보정 프로파일(K 프로파일)이 적용되지 않았습니다',
|
||||
assignmentNotConfirmed: '{{printer}}의 슬롯 {{slot}} 할당을 확인할 수 없습니다. AMS 슬롯을 확인하세요',
|
||||
|
||||
@@ -447,6 +447,7 @@ export default {
|
||||
toast: {
|
||||
printerDeleted: 'Impressora excluída',
|
||||
missingSpoolAssignment: 'Impressão iniciada em {{printer}}. Atribuição de bobina ausente para: {{slots}}',
|
||||
killSwitchTriggered: 'O bloqueio de segurança de cobrança interrompeu uma impressão não autorizada em {{printer}}: {{filename}}',
|
||||
assignmentVerified: 'Filamento carregado no compartimento {{slot}} ({{printer}})',
|
||||
assignmentVerifiedNoKprofile: 'Compartimento {{slot}} em {{printer}} carregado, mas o perfil de calibração de fluxo (perfil K) não foi aplicado',
|
||||
assignmentNotConfirmed: 'Não foi possível confirmar a atribuição do compartimento {{slot}} em {{printer}} — verifique o compartimento AMS',
|
||||
|
||||
@@ -426,6 +426,7 @@ export default {
|
||||
toast: {
|
||||
printerDeleted: "Принтер удалён",
|
||||
missingSpoolAssignment: "На принтере {{printer}} началась печать. Не назначены катушки для слотов: {{slots}}",
|
||||
killSwitchTriggered: 'Аварийный выключатель биллинга остановил несанкционированную печать на {{printer}}: {{filename}}',
|
||||
assignmentVerified: "Филамент загружен в слот {{slot}} ({{printer}})",
|
||||
assignmentVerifiedNoKprofile: "Слот {{slot}} на {{printer}} загружен, но профиль калибровки потока (K-профиль) не применён",
|
||||
assignmentNotConfirmed: "Не удалось подтвердить назначение слота {{slot}} на {{printer}} — проверьте слот AMS",
|
||||
|
||||
@@ -447,6 +447,7 @@ export default {
|
||||
toast: {
|
||||
printerDeleted: 'Yazıcı silindi',
|
||||
missingSpoolAssignment: '{{printer}} üzerinde baskı başladı. Şunlar için eksik makara ataması: {{slots}}',
|
||||
killSwitchTriggered: 'Faturalandırma durdurma anahtarı {{printer}} üzerindeki yetkisiz baskıyı durdurdu: {{filename}}',
|
||||
assignmentVerified: '{{slot}} yuvasına filament yüklendi ({{printer}})',
|
||||
assignmentVerifiedNoKprofile: '{{printer}} üzerindeki {{slot}} yuvası yüklendi, ancak akış kalibrasyonu profili (K profili) uygulanmadı',
|
||||
assignmentNotConfirmed: '{{printer}} üzerindeki {{slot}} yuvası ataması doğrulanamadı — AMS yuvasını kontrol edin',
|
||||
|
||||
@@ -450,6 +450,7 @@ export default {
|
||||
toast: {
|
||||
printerDeleted: "Принтер видалено",
|
||||
missingSpoolAssignment: "Друк на {{printer}} розпочато. Для слотів {{slots}} не призначено котушки.",
|
||||
killSwitchTriggered: 'Аварійний вимикач білінгу зупинив несанкціонований друк на {{printer}}: {{filename}}',
|
||||
assignmentVerified: "Філамент завантажено в слот AMS {{slot}} принтера {{printer}}",
|
||||
assignmentVerifiedNoKprofile: "Слот AMS {{slot}} на {{printer}} завантажено, але калібрування потоку (K-профіль) не застосовано",
|
||||
assignmentNotConfirmed: "Не вдалося підтвердити призначення для слота {{slot}} на {{printer}} — перевірте слот AMS",
|
||||
|
||||
@@ -447,6 +447,7 @@ export default {
|
||||
toast: {
|
||||
printerDeleted: '打印机已删除',
|
||||
missingSpoolAssignment: '已在{{printer}}上开始打印。以下料槽未分配耗材: {{slots}}',
|
||||
killSwitchTriggered: '计费终止开关已停止 {{printer}} 上的未授权打印:{{filename}}',
|
||||
assignmentVerified: '耗材已加载到料槽{{slot}}({{printer}})',
|
||||
assignmentVerifiedNoKprofile: '{{printer}}的料槽{{slot}}已加载,但流量校准配置(K配置)未应用',
|
||||
assignmentNotConfirmed: '无法确认{{printer}}上料槽{{slot}}的分配,请检查AMS料槽',
|
||||
|
||||
@@ -447,6 +447,7 @@ export default {
|
||||
toast: {
|
||||
printerDeleted: '印表機已刪除',
|
||||
missingSpoolAssignment: '已在{{printer}}上開始列印。以下料槽未分配耗材: {{slots}}',
|
||||
killSwitchTriggered: '計費終止開關已停止 {{printer}} 上的未授權列印:{{filename}}',
|
||||
assignmentVerified: '耗材已載入料槽{{slot}}({{printer}})',
|
||||
assignmentVerifiedNoKprofile: '{{printer}}的料槽{{slot}}已載入,但流量校準設定檔(K設定檔)未套用',
|
||||
assignmentNotConfirmed: '無法確認{{printer}}上料槽{{slot}}的分配,請檢查AMS料槽',
|
||||
|
||||
Reference in New Issue
Block a user