blob: 146fb56696372672b3902516610a9f43220d6ccf [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
"""Tests for multiproduct/dbcursor.py"""
import unittest
from multiproduct.dbcursor import BloodhoundProductSQLTranslate, SKIP_TABLES, TRANSLATE_TABLES, PRODUCT_COLUMN
# Test case data, each section consists of list of tuples of original and correctly translated SQL statements
data = {
# non-translated SELECTs
'system_select_nontranslated' : [
(
"""SELECT id,
name,
value
FROM repository
WHERE name IN ('alias',
'description',
'dir',
'hidden',
'name',
'type',
'url')""",
"""SELECT id,
name,
value
FROM repository
WHERE name IN ('alias',
'description',
'dir',
'hidden',
'name',
'type',
'url')"""
),
],
# translated SELECTs
'system_select_translated' : [
(
"""SELECT TYPE, id,
filename,
time,
description,
author
FROM attachment
WHERE time > %s
AND time < %s
AND TYPE = %s""",
"""SELECT TYPE, id,
filename,
time,
description,
author
FROM (SELECT * FROM attachment WHERE product='PRODUCT') AS attachment
WHERE time > %s
AND time < %s
AND TYPE = %s"""
),
(
"""SELECT name,
due,
completed,
description
FROM milestone
WHERE name=%s""",
"""SELECT name,
due,
completed,
description
FROM (SELECT * FROM milestone WHERE product='PRODUCT') AS milestone
WHERE name=%s"""
),
(
"""SELECT COALESCE(component, ''),
count(COALESCE(component, ''))
FROM ticket
GROUP BY COALESCE(component, '')""",
"""SELECT COALESCE(component, ''),
count(COALESCE(component, ''))
FROM (SELECT * FROM ticket WHERE product='PRODUCT') AS ticket
GROUP BY COALESCE(component, '')"""
),
(
"""SELECT id, time, reporter, TYPE, summary,
description
FROM ticket
WHERE time>=%s
AND time<=%s""",
"""SELECT id, time, reporter, TYPE, summary,
description
FROM (SELECT * FROM ticket WHERE product='PRODUCT') AS ticket
WHERE time>=%s
AND time<=%s"""
),
(
"""SELECT t.id,
tc.time,
tc.author,
t.type,
t.summary,
tc.field,
tc.oldvalue,
tc.newvalue
FROM ticket_change tc
INNER JOIN ticket t ON t.id = tc.ticket
AND tc.time>=1351375199999999
AND tc.time<=1354057199999999
ORDER BY tc.time""",
"""SELECT t.id,
tc.time,
tc.author,
t.type,
t.summary,
tc.field,
tc.oldvalue,
tc.newvalue
FROM (SELECT * FROM ticket_change WHERE product='PRODUCT') AS tc
INNER JOIN (SELECT * FROM ticket WHERE product='PRODUCT') AS t ON t.id = tc.ticket
AND tc.time>=1351375199999999
AND tc.time<=1354057199999999
ORDER BY tc.time"""
),
(
"""SELECT COUNT(*)
FROM
(SELECT t.id AS id,
t.summary AS summary,
t.owner AS OWNER,
t.status AS status,
t.priority AS priority,
t.milestone AS milestone,
t.time AS time,
t.changetime AS changetime,
priority.value AS priority_value
FROM ticket AS t
LEFT OUTER JOIN enum AS priority ON (priority.type='priority'
AND priority.name=priority)
LEFT OUTER JOIN milestone ON (milestone.name=milestone)
WHERE ((COALESCE(t.status,'')!=%s)
AND (COALESCE(t.OWNER,'')=%s))
ORDER BY COALESCE(t.milestone,'')='',
COALESCE(milestone.completed,0)=0,
milestone.completed,
COALESCE(milestone.due,0)=0,
milestone.due,
t.milestone,
COALESCE(priority.value,'')='' DESC,CAST(priority.value AS integer) DESC,t.id) AS x""",
"""SELECT COUNT(*)
FROM
(SELECT t.id AS id,
t.summary AS summary,
t.owner AS OWNER,
t.status AS status,
t.priority AS priority,
t.milestone AS milestone,
t.time AS time,
t.changetime AS changetime,
priority.value AS priority_value
FROM (SELECT * FROM ticket WHERE product='PRODUCT') AS t
LEFT OUTER JOIN (SELECT * FROM enum WHERE product='PRODUCT') AS priority ON (priority.type='priority'
AND priority.name=priority)
LEFT OUTER JOIN (SELECT * FROM milestone WHERE product='PRODUCT') AS milestone ON (milestone.name=milestone)
WHERE ((COALESCE(t.status,'')!=%s)
AND (COALESCE(t.OWNER,'')=%s))
ORDER BY COALESCE(t.milestone,'')='',
COALESCE(milestone.completed,0)=0,
milestone.completed,
COALESCE(milestone.due,0)=0,
milestone.due,
t.milestone,
COALESCE(priority.value,'')='' DESC,CAST(priority.value AS integer) DESC,t.id) AS x"""
),
(
"""SELECT t.id AS id,
t.summary AS summary,
t.owner AS OWNER,
t.status AS status,
t.priority AS priority,
t.milestone AS milestone,
t.time AS time,
t.changetime AS changetime,
priority.value AS priority_value
FROM ticket AS t
LEFT OUTER JOIN enum AS priority ON (priority.type='priority'
AND priority.name=priority)
LEFT OUTER JOIN milestone ON (milestone.name=milestone)
WHERE ((COALESCE(t.status,'')!=%s)
AND (COALESCE(t.OWNER,'')=%s))
ORDER BY COALESCE(t.milestone,'')='',
COALESCE(milestone.completed,0)=0,
milestone.completed,
COALESCE(milestone.due,0)=0,
milestone.due,
t.milestone,
COALESCE(priority.value,'')='' DESC,
CAST(priority.value AS integer) DESC,t.id""",
"""SELECT t.id AS id,
t.summary AS summary,
t.owner AS OWNER,
t.status AS status,
t.priority AS priority,
t.milestone AS milestone,
t.time AS time,
t.changetime AS changetime,
priority.value AS priority_value
FROM (SELECT * FROM ticket WHERE product='PRODUCT') AS t
LEFT OUTER JOIN (SELECT * FROM enum WHERE product='PRODUCT') AS priority ON (priority.type='priority'
AND priority.name=priority)
LEFT OUTER JOIN (SELECT * FROM milestone WHERE product='PRODUCT') AS milestone ON (milestone.name=milestone)
WHERE ((COALESCE(t.status,'')!=%s)
AND (COALESCE(t.OWNER,'')=%s))
ORDER BY COALESCE(t.milestone,'')='',
COALESCE(milestone.completed,0)=0,
milestone.completed,
COALESCE(milestone.due,0)=0,
milestone.due,
t.milestone,
COALESCE(priority.value,'')='' DESC,
CAST(priority.value AS integer) DESC,t.id"""
),
(
"""SELECT COUNT(*)
FROM
(SELECT p.value AS __color__, id AS ticket, summary, component, VERSION, milestone, t.type AS TYPE, OWNER, status,
time AS created,
changetime AS _changetime,
description AS _description,
reporter AS _reporter
FROM ticket t
LEFT JOIN enum p ON p.name = t.priority
AND p.TYPE = 'priority'
WHERE status <> 'closed'
ORDER BY CAST(p.value AS integer),
milestone,
t.TYPE, time ) AS tab""",
"""SELECT COUNT(*)
FROM
(SELECT p.value AS __color__, id AS ticket, summary, component, VERSION, milestone, t.type AS TYPE, OWNER, status,
time AS created,
changetime AS _changetime,
description AS _description,
reporter AS _reporter
FROM (SELECT * FROM ticket WHERE product='PRODUCT') AS t
LEFT JOIN (SELECT * FROM enum WHERE product='PRODUCT') AS p ON p.name = t.priority
AND p.TYPE = 'priority'
WHERE status <> 'closed'
ORDER BY CAST(p.value AS integer),
milestone,
t.TYPE, time ) AS tab"""
),
(
"""SELECT COUNT(*)
FROM
(SELECT t.id AS id,
t.summary AS summary,
t.status AS status,
t.type AS TYPE,
t.priority AS priority,
t.product AS product,
t.milestone AS milestone,
t.time AS time,
t.changetime AS changetime,
t.owner AS OWNER,
priority.value AS priority_value
FROM ticket AS t
LEFT OUTER JOIN enum AS priority ON (priority.TYPE='priority'
AND priority.name=priority)
WHERE ((COALESCE(t.status,'')!=%s)
AND (COALESCE(t.OWNER,'')=%s))
ORDER BY COALESCE(priority.value,'')='',
CAST(priority.value AS integer),
t.id) AS x""",
"""SELECT COUNT(*)
FROM
(SELECT t.id AS id,
t.summary AS summary,
t.status AS status,
t.type AS TYPE,
t.priority AS priority,
t.product AS product,
t.milestone AS milestone,
t.time AS time,
t.changetime AS changetime,
t.owner AS OWNER,
priority.value AS priority_value
FROM (SELECT * FROM ticket WHERE product='PRODUCT') AS t
LEFT OUTER JOIN (SELECT * FROM enum WHERE product='PRODUCT') AS priority ON (priority.TYPE='priority'
AND priority.name=priority)
WHERE ((COALESCE(t.status,'')!=%s)
AND (COALESCE(t.OWNER,'')=%s))
ORDER BY COALESCE(priority.value,'')='',
CAST(priority.value AS integer),
t.id) AS x"""
),
(
"""SELECT t.id AS id,
t.summary AS summary,
t.status AS status,
t.type AS TYPE,
t.priority AS priority,
t.product AS product,
t.milestone AS milestone,
t.time AS time,
t.changetime AS changetime,
t.owner AS OWNER,
priority.value AS priority_value
FROM ticket AS t
LEFT OUTER JOIN enum AS priority ON (priority.TYPE='priority'
AND priority.name=priority)
WHERE ((COALESCE(t.status,'')!=%s)
AND (COALESCE(t.OWNER,'')=%s))
ORDER BY COALESCE(priority.value,'')='',
CAST(priority.value AS integer),
t.id""",
"""SELECT t.id AS id,
t.summary AS summary,
t.status AS status,
t.type AS TYPE,
t.priority AS priority,
t.product AS product,
t.milestone AS milestone,
t.time AS time,
t.changetime AS changetime,
t.owner AS OWNER,
priority.value AS priority_value
FROM (SELECT * FROM ticket WHERE product='PRODUCT') AS t
LEFT OUTER JOIN (SELECT * FROM enum WHERE product='PRODUCT') AS priority ON (priority.TYPE='priority'
AND priority.name=priority)
WHERE ((COALESCE(t.status,'')!=%s)
AND (COALESCE(t.OWNER,'')=%s))
ORDER BY COALESCE(priority.value,'')='',
CAST(priority.value AS integer),
t.id"""
),
(
"""SELECT *
FROM
(SELECT p.value AS __color__, id AS ticket, summary, component, VERSION, milestone, t.type AS TYPE, OWNER, status,
time AS created,
changetime AS _changetime,
description AS _description,
reporter AS _reporter
FROM ticket t
LEFT JOIN enum p ON p.name = t.priority
AND p.TYPE = 'priority'
WHERE status <> 'closed'
ORDER BY CAST(p.value AS integer),
milestone,
t.TYPE, time ) AS tab LIMIT 1""",
"""SELECT *
FROM
(SELECT p.value AS __color__, id AS ticket, summary, component, VERSION, milestone, t.type AS TYPE, OWNER, status,
time AS created,
changetime AS _changetime,
description AS _description,
reporter AS _reporter
FROM (SELECT * FROM ticket WHERE product='PRODUCT') AS t
LEFT JOIN (SELECT * FROM enum WHERE product='PRODUCT') AS p ON p.name = t.priority
AND p.TYPE = 'priority'
WHERE status <> 'closed'
ORDER BY CAST(p.value AS integer),
milestone,
t.TYPE, time ) AS tab LIMIT 1"""
),
(
"""SELECT p.value AS __color__, id AS ticket, summary, component, VERSION, milestone, t.type AS TYPE, OWNER, status,
time AS created,
changetime AS _changetime,
description AS _description,
reporter AS _reporter
FROM ticket t
LEFT JOIN enum p ON p.name = t.priority
AND p.TYPE = 'priority'
WHERE status <> 'closed'
ORDER BY CAST(p.value AS integer),
milestone,
t.TYPE, time""",
"""SELECT p.value AS __color__, id AS ticket, summary, component, VERSION, milestone, t.type AS TYPE, OWNER, status,
time AS created,
changetime AS _changetime,
description AS _description,
reporter AS _reporter
FROM (SELECT * FROM ticket WHERE product='PRODUCT') AS t
LEFT JOIN (SELECT * FROM enum WHERE product='PRODUCT') AS p ON p.name = t.priority
AND p.TYPE = 'priority'
WHERE status <> 'closed'
ORDER BY CAST(p.value AS integer),
milestone,
t.TYPE, time"""
),
(
"""SELECT COALESCE(version, '') ,
count(COALESCE(version, ''))
FROM
(SELECT t.id AS id,
t.summary AS summary,
t.owner AS owner,
t.type AS type,
t.status AS status,
t.priority AS priority,
t.milestone AS milestone,
t.version AS version,
t.time AS time,
t.changetime AS changetime,
t.product AS product,
priority.value AS priority_value
FROM
(SELECT *
FROM ticket
WHERE product="default") AS t
LEFT OUTER JOIN
(SELECT *
FROM enum
WHERE product="default") AS priority ON (priority.type='priority'
AND priority.name=priority)
LEFT OUTER JOIN
(SELECT *
FROM version
WHERE product="default") AS version ON (version.name=version)
WHERE ((COALESCE(t.product,'')='default'))
ORDER BY COALESCE(t.version,'')='',
COALESCE(version.time,0)=0,version.time,
t.version,COALESCE(priority.value,'')='',
CAST(priority.value AS integer),
t.id) AS foo
GROUP BY COALESCE(version, '')""",
"""SELECT COALESCE(version, '') ,
count(COALESCE(version, ''))
FROM
(SELECT t.id AS id,
t.summary AS summary,
t.owner AS owner,
t.type AS type,
t.status AS status,
t.priority AS priority,
t.milestone AS milestone,
t.version AS version,
t.time AS time,
t.changetime AS changetime,
t.product AS product,
priority.value AS priority_value
FROM
(SELECT *
FROM (SELECT * FROM ticket WHERE product='PRODUCT') AS ticket
WHERE product="default") AS t
LEFT OUTER JOIN
(SELECT *
FROM (SELECT * FROM enum WHERE product='PRODUCT') AS enum
WHERE product="default") AS priority ON (priority.type='priority'
AND priority.name=priority)
LEFT OUTER JOIN
(SELECT *
FROM (SELECT * FROM version WHERE product='PRODUCT') AS version
WHERE product="default") AS version ON (version.name=version)
WHERE ((COALESCE(t.product,'')='default'))
ORDER BY COALESCE(t.version,'')='',
COALESCE(version.time,0)=0,version.time,
t.version,COALESCE(priority.value,'')='',
CAST(priority.value AS integer),
t.id) AS foo
GROUP BY COALESCE(version, '')"""
),
(
"""SELECT w1.name, w1.time, w1.author, w1.text
FROM wiki w1,(SELECT name, max(version) AS ver
FROM wiki GROUP BY name) w2
WHERE w1.version = w2.ver AND w1.name = w2.name
AND (w1.name LIKE %s ESCAPE '/' OR w1.author LIKE %s ESCAPE '/' OR w1.text LIKE %s ESCAPE '/')""",
"""SELECT w1.name, w1.time, w1.author, w1.text
FROM (SELECT * FROM wiki WHERE product='PRODUCT') AS w1,(SELECT name, max(version) AS ver
FROM (SELECT * FROM wiki WHERE product='PRODUCT') AS wiki GROUP BY name) AS w2
WHERE w1.version = w2.ver AND w1.name = w2.name
AND (w1.name LIKE %s ESCAPE '/' OR w1.author LIKE %s ESCAPE '/' OR w1.text LIKE %s ESCAPE '/')"""
),
(
"""INSERT INTO ticket(id, type, time, changetime, component, severity, priority,
owner, reporter, cc, version, milestone, status, resolution,
summary, description, keywords)
SELECT id, 'defect', time, changetime, component, severity, priority, owner,
reporter, cc, version, milestone, status, resolution, summary,
description, keywords FROM ticket_old
WHERE COALESCE(severity,'') <> 'enhancement'""",
"""INSERT INTO ticket(id, type, time, changetime, component, severity, priority,
owner, reporter, cc, version, milestone, status, resolution,
summary, description, keywords, product)
SELECT id, 'defect', time, changetime, component, severity, priority, owner,
reporter, cc, version, milestone, status, resolution, summary,
description, keywords, 'PRODUCT' FROM (SELECT * FROM "PRODUCT_ticket_old") AS ticket_old
WHERE COALESCE(severity,'') <> 'enhancement'"""
),
(
"""INSERT INTO ticket(id, type, time, changetime, component, severity, priority,
owner, reporter, cc, version, milestone, status, resolution,
summary, description, keywords)
SELECT id, 'enhancement', time, changetime, component, 'normal', priority,
owner, reporter, cc, version, milestone, status, resolution, summary,
description, keywords FROM ticket_old
WHERE severity = 'enhancement'""",
"""INSERT INTO ticket(id, type, time, changetime, component, severity, priority,
owner, reporter, cc, version, milestone, status, resolution,
summary, description, keywords, product)
SELECT id, 'enhancement', time, changetime, component, 'normal', priority,
owner, reporter, cc, version, milestone, status, resolution, summary,
description, keywords, 'PRODUCT' FROM (SELECT * FROM "PRODUCT_ticket_old") AS ticket_old
WHERE severity = 'enhancement'"""
),
(
"""SELECT COUNT(*) FROM (
SELECT __color__, __group,
(CASE
WHEN __group = 1 THEN 'Accepted'
WHEN __group = 2 THEN 'Owned'
WHEN __group = 3 THEN 'Reported'
ELSE 'Commented' END) AS __group__,
ticket, summary, component, version, milestone,
type, priority, created, _changetime, _description,
_reporter
FROM (
SELECT DISTINCT CAST(p.value AS integer) AS __color__,
(CASE
WHEN owner = %s AND status = 'accepted' THEN 1
WHEN owner = %s THEN 2
WHEN reporter = %s THEN 3
ELSE 4 END) AS __group,
t.id AS ticket, summary, component, version, milestone,
t.type AS type, priority, t.time AS created,
t.changetime AS _changetime, description AS _description,
reporter AS _reporter
FROM ticket t
LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority'
LEFT JOIN ticket_change tc ON tc.ticket = t.id AND tc.author = %s
AND tc.field = 'comment'
WHERE t.status <> 'closed'
AND (owner = %s OR reporter = %s OR author = %s)
) AS sub
ORDER BY __group, __color__, milestone, type, created
) AS tab""",
"""SELECT COUNT(*) FROM (
SELECT __color__, __group,
(CASE
WHEN __group = 1 THEN 'Accepted'
WHEN __group = 2 THEN 'Owned'
WHEN __group = 3 THEN 'Reported'
ELSE 'Commented' END) AS __group__,
ticket, summary, component, version, milestone,
type, priority, created, _changetime, _description,
_reporter
FROM (
SELECT DISTINCT CAST(p.value AS integer) AS __color__,
(CASE
WHEN owner = %s AND status = 'accepted' THEN 1
WHEN owner = %s THEN 2
WHEN reporter = %s THEN 3
ELSE 4 END) AS __group,
t.id AS ticket, summary, component, version, milestone,
t.type AS type, priority, t.time AS created,
t.changetime AS _changetime, description AS _description,
reporter AS _reporter
FROM (SELECT * FROM ticket WHERE product='PRODUCT') AS t
LEFT JOIN (SELECT * FROM enum WHERE product='PRODUCT') AS p ON p.name = t.priority AND p.type = 'priority'
LEFT JOIN (SELECT * FROM ticket_change WHERE product='PRODUCT') AS tc ON tc.ticket = t.id AND tc.author = %s
AND tc.field = 'comment'
WHERE t.status <> 'closed'
AND (owner = %s OR reporter = %s OR author = %s)
) AS sub
ORDER BY __group, __color__, milestone, type, created
) AS tab"""
),
],
# custom table SELECTs
'custom_select' : [
(
"""SELECT bklg_id, count(*) as total
FROM backlog_ticket
WHERE tkt_order IS NULL OR tkt_order > -1
GROUP BY bklg_id
""",
"""SELECT bklg_id, count(*) as total
FROM (SELECT * FROM "PRODUCT_backlog_ticket") AS backlog_ticket
WHERE tkt_order IS NULL OR tkt_order > -1
GROUP BY bklg_id
"""
),
(
"""SELECT bt.bklg_id, t.status, count(*) as total
FROM backlog_ticket bt, ticket t
WHERE t.id = bt.tkt_id
AND (bt.tkt_order IS NULL OR bt.tkt_order > -1)
GROUP BY bklg_id, status""",
"""SELECT bt.bklg_id, t.status, count(*) as total
FROM (SELECT * FROM "PRODUCT_backlog_ticket") AS bt, (SELECT * FROM ticket WHERE product='PRODUCT') AS t
WHERE t.id = bt.tkt_id
AND (bt.tkt_order IS NULL OR bt.tkt_order > -1)
GROUP BY bklg_id, status"""
),
],
# non-translated INSERTs
'system_insert_nontranslated' : [
(
"""INSERT INTO session VALUES (%s,%s,0)""",
"""INSERT INTO session VALUES (%s,%s,0)"""
),
],
# translated INSERTs
'system_insert_translated' : [
(
"""INSERT INTO ticket_custom (ticket, name, value)
SELECT id, 'totalhours', '0' FROM ticket WHERE id NOT IN (
SELECT ticket from ticket_custom WHERE name='totalhours'
)""",
"""INSERT INTO ticket_custom (ticket, name, value, product)
SELECT id, 'totalhours', '0', 'PRODUCT' FROM (SELECT * FROM ticket WHERE product='PRODUCT') AS ticket WHERE id NOT IN (
SELECT ticket from (SELECT * FROM ticket_custom WHERE product='PRODUCT') AS ticket_custom WHERE name='totalhours'
)"""
),
(
"""INSERT INTO ticket_custom (ticket, name, value)
SELECT id, 'totalhours', '0' FROM ticket WHERE id NOT IN (
SELECT ticket from ticket_custom WHERE name='totalhours')""",
"""INSERT INTO ticket_custom (ticket, name, value, product)
SELECT id, 'totalhours', '0', 'PRODUCT' FROM (SELECT * FROM ticket WHERE product='PRODUCT') AS ticket WHERE id NOT IN (
SELECT ticket from (SELECT * FROM ticket_custom WHERE product='PRODUCT') AS ticket_custom WHERE name='totalhours')"""
),
(
"""INSERT INTO session (sid, last_visit, authenticated)
SELECT distinct s.sid,COALESCE(%s,0),s.authenticated
FROM session_old AS s LEFT JOIN session_old AS s2
ON (s.sid=s2.sid AND s2.var_name='last_visit')
WHERE s.sid IS NOT NULL""",
"""INSERT INTO session (sid, last_visit, authenticated)
SELECT distinct s.sid,COALESCE(%s,0),s.authenticated
FROM (SELECT * FROM "PRODUCT_session_old") AS s LEFT JOIN (SELECT * FROM "PRODUCT_session_old") AS s2
ON (s.sid=s2.sid AND s2.var_name='last_visit')
WHERE s.sid IS NOT NULL"""
),
(
"""INSERT INTO session_attribute (sid, authenticated, name, value)
SELECT s.sid, s.authenticated, s.var_name, s.var_value
FROM session_old s
WHERE s.var_name <> 'last_visit' AND s.sid IS NOT NULL""",
"""INSERT INTO session_attribute (sid, authenticated, name, value)
SELECT s.sid, s.authenticated, s.var_name, s.var_value
FROM (SELECT * FROM "PRODUCT_session_old") AS s
WHERE s.var_name <> 'last_visit' AND s.sid IS NOT NULL"""
),
(
"""INSERT INTO wiki(version, name, time, author, ipnr, text)
SELECT 1 + COALESCE(max(version), 0), %s, %s, 'trac',
'127.0.0.1', %s FROM wiki WHERE name=%s""",
"""INSERT INTO wiki(version, name, time, author, ipnr, text, product)
SELECT 1 + COALESCE(max(version), 0), %s, %s, 'trac',
'127.0.0.1', %s, 'PRODUCT' FROM (SELECT * FROM wiki WHERE product='PRODUCT') AS wiki WHERE name=%s"""
),
(
"""INSERT INTO permission VALUES ('dev','WIKI_VIEW')""",
"""INSERT INTO permission VALUES ('dev','WIKI_VIEW','PRODUCT')"""
),
(
"""INSERT INTO permission (username, action) VALUES ('dev','WIKI_VIEW')""",
"""INSERT INTO permission (username, action, product) VALUES ('dev','WIKI_VIEW','PRODUCT')"""
),
],
'custom_insert' : [
(
"""INSERT INTO node_change (rev,path,kind,change,base_path,base_rev)
SELECT rev,path,kind,change,base_path,base_rev FROM node_change_old""",
"""INSERT INTO node_change (rev,path,kind,change,base_path,base_rev)
SELECT rev,path,kind,change,base_path,base_rev FROM (SELECT * FROM "PRODUCT_node_change_old") AS node_change_old"""
),
],
# translated UPDATEs
'system_update_translated' : [
(
"""UPDATE ticket SET changetime=%s WHERE id=%s""",
"""UPDATE ticket SET changetime=%s WHERE product='PRODUCT' AND id=%s"""
),
(
"""UPDATE ticket SET changetime=(
SELECT time FROM ticket_change WHERE ticket=%s
UNION
SELECT time FROM (
SELECT time FROM ticket WHERE id=%s LIMIT 1) AS t
ORDER BY time DESC LIMIT 1)
WHERE id=%s""",
"""UPDATE ticket SET changetime=(
SELECT time FROM (SELECT * FROM ticket_change WHERE product='PRODUCT') AS ticket_change WHERE ticket=%s
UNION
SELECT time FROM (
SELECT time FROM (SELECT * FROM ticket WHERE product='PRODUCT') AS ticket WHERE id=%s LIMIT 1) AS t
ORDER BY time DESC LIMIT 1)
WHERE product='PRODUCT' AND id=%s"""
),
(
"""UPDATE component SET name=%s,owner=%s, description=%s
WHERE name=%s""",
"""UPDATE component SET name=%s,owner=%s, description=%s
WHERE product='PRODUCT' AND name=%s"""
),
(
"""UPDATE milestone
SET name=%s, due=%s, completed=%s, description=%s
WHERE name=%s""",
"""UPDATE milestone
SET name=%s, due=%s, completed=%s, description=%s
WHERE product='PRODUCT' AND name=%s"""
),
(
"""UPDATE wiki
SET text=%s
WHERE name=%s""",
"""UPDATE wiki
SET text=%s
WHERE product='PRODUCT' AND name=%s"""
),
(
"""UPDATE ticket SET product=%s
WHERE product=%s""",
"""UPDATE ticket SET product=%s
WHERE product='PRODUCT' AND product=%s"""
),
(
"""UPDATE ticket set changetime=%s where id=%s""",
"""UPDATE ticket set changetime=%s where product='PRODUCT' AND id=%s"""
),
(
"""UPDATE
milestone
SET
id_project='%s' WHERE milestone='%s'""",
"""UPDATE
milestone
SET
id_project='%s' WHERE product='PRODUCT' AND milestone='%s'"""
),
(
"""UPDATE ticket_change SET newvalue=%s
WHERE ticket=%s and author=%s and time=%s and field=%s""",
"""UPDATE ticket_change SET newvalue=%s
WHERE product='PRODUCT' AND ticket=%s and author=%s and time=%s and field=%s"""
),
(
"""UPDATE ticket_change SET oldvalue=%s, newvalue=%s
WHERE ticket=%s and author=%s and time=%s and field=%s""",
"""UPDATE ticket_change SET oldvalue=%s, newvalue=%s
WHERE product='PRODUCT' AND ticket=%s and author=%s and time=%s and field=%s"""
),
(
"""UPDATE
ticket_custom
SET
value = '%s'
WHERE
name = 'project' AND value = '%s'""",
"""UPDATE
ticket_custom
SET
value = '%s'
WHERE
product='PRODUCT' AND name = 'project' AND value = '%s'"""
),
],
# non-translated UPDATEs
'system_update_nontranslated' : [
(
"""UPDATE session_attribute
SET value='1'
WHERE sid=%s
AND name='password_refreshed'""",
"""UPDATE session_attribute
SET value='1'
WHERE sid=%s
AND name='password_refreshed'"""
),
(
"""UPDATE session_attribute
SET value=%s""",
"""UPDATE session_attribute
SET value=%s"""
),
(
"""UPDATE auth_cookie
SET time=%s
WHERE cookie=%s""",
"""UPDATE auth_cookie
SET time=%s
WHERE cookie=%s"""
),
],
# custom (plugin) table UPDATEs
'custom_update' : [
(
"""UPDATE subscription
SET format=%s
WHERE distributor=%s
AND sid=%s
AND authenticated=%s""",
"""UPDATE "PRODUCT_subscription"
SET format=%s
WHERE distributor=%s
AND sid=%s
AND authenticated=%s"""
),
(
"""UPDATE subscription
SET changetime=CURRENT_TIMESTAMP,
priority=%s
WHERE id=%s""",
"""UPDATE "PRODUCT_subscription"
SET changetime=CURRENT_TIMESTAMP,
priority=%s
WHERE id=%s"""
),
(
"""UPDATE backlog_ticket SET tkt_order = NULL WHERE tkt_id = %s""",
"""UPDATE "PRODUCT_backlog_ticket" SET tkt_order = NULL WHERE tkt_id = %s"""
),
(
"""UPDATE backlog_ticket SET tkt_order = -1
WHERE bklg_id = %s
AND tkt_id IN
(SELECT id FROM ticket
WHERE status = 'closed')""",
"""UPDATE "PRODUCT_backlog_ticket" SET tkt_order = -1
WHERE bklg_id = %s
AND tkt_id IN
(SELECT id FROM (SELECT * FROM ticket WHERE product='PRODUCT') AS ticket
WHERE status = 'closed')"""
),
(
"""UPDATE backlog_ticket SET tkt_order = -1
WHERE bklg_id = %s
AND tkt_id IN (SELECT id FROM ticket
WHERE status = 'closed')""",
"""UPDATE "PRODUCT_backlog_ticket" SET tkt_order = -1
WHERE bklg_id = %s
AND tkt_id IN (SELECT id FROM (SELECT * FROM ticket WHERE product='PRODUCT') AS ticket
WHERE status = 'closed')"""
),
(
"""UPDATE estimate SET rate=%s, variability=%s, communication=%s, tickets=%s, comment=%s
WHERE id=%s""",
"""UPDATE "PRODUCT_estimate" SET rate=%s, variability=%s, communication=%s, tickets=%s, comment=%s
WHERE id=%s"""
),
(
"""UPDATE estimate_line_item SET estimate_id=%s ,
description=%s, low=%s, high=%s
WHERE id=%s""",
"""UPDATE "PRODUCT_estimate_line_item" SET estimate_id=%s ,
description=%s, low=%s, high=%s
WHERE id=%s"""
),
(
"""UPDATE estimate SET rate=%s, variability=%s, communication=%s, tickets=%s, comment=%s,
diffcomment=%s, saveepoch=%s
WHERE id=%s""",
"""UPDATE "PRODUCT_estimate" SET rate=%s, variability=%s, communication=%s, tickets=%s, comment=%s,
diffcomment=%s, saveepoch=%s
WHERE id=%s"""
),
(
"""UPDATE estimate_line_item SET estimate_id=%s ,
description=%s, low=%s, high=%s
WHERE id=%s""",
"""UPDATE "PRODUCT_estimate_line_item" SET estimate_id=%s ,
description=%s, low=%s, high=%s
WHERE id=%s"""
),
(
"""UPDATE estimate SET rate=%s, variability=%s, communication=%s, tickets=%s, comment=%s,
diffcomment=%s, saveepoch=%s
WHERE id=%s""",
"""UPDATE "PRODUCT_estimate" SET rate=%s, variability=%s, communication=%s, tickets=%s, comment=%s,
diffcomment=%s, saveepoch=%s
WHERE id=%s"""
),
],
# custom CREATE TABLE
'custom_create_table' : [
(
"""CREATE TABLE estimate(
id integer PRIMARY KEY,
rate DECIMAL,
variability DECIMAL,
communication DECIMAL,
tickets VARCHAR(512),
comment VARCHAR(8000)
)""",
"""CREATE TABLE "PRODUCT_estimate"(
id integer PRIMARY KEY,
rate DECIMAL,
variability DECIMAL,
communication DECIMAL,
tickets VARCHAR(512),
comment VARCHAR(8000)
)"""
),
(
"""CREATE TABLE estimate_line_item(
id integer PRIMARY KEY,
estimate_id integer,
description VARCHAR(2048),
low DECIMAL,
high DECIMAL
)""",
"""CREATE TABLE "PRODUCT_estimate_line_item"(
id integer PRIMARY KEY,
estimate_id integer,
description VARCHAR(2048),
low DECIMAL,
high DECIMAL
)"""
),
(
"""CREATE TABLE backlog_ticket (bklg_id INTEGER NOT NULL,"
" tkt_id INTEGER NOT NULL,"
" tkt_order REAL,"
" PRIMARY KEY(bklg_id, tkt_id))""",
"""CREATE TABLE "PRODUCT_backlog_ticket" (bklg_id INTEGER NOT NULL,"
" tkt_id INTEGER NOT NULL,"
" tkt_order REAL,"
" PRIMARY KEY(bklg_id, tkt_id))"""
),
(
"""CREATE TEMPORARY TABLE backlog_ticket (bklg_id INTEGER NOT NULL,"
" tkt_id INTEGER NOT NULL,"
" tkt_order REAL,"
" PRIMARY KEY(bklg_id, tkt_id))""",
"""CREATE TEMPORARY TABLE "PRODUCT_backlog_ticket" (bklg_id INTEGER NOT NULL,"
" tkt_id INTEGER NOT NULL,"
" tkt_order REAL,"
" PRIMARY KEY(bklg_id, tkt_id))"""
),
(
"""CREATE TEMPORARY TABLE table_old AS SELECT * FROM table""",
"""CREATE TEMPORARY TABLE "PRODUCT_table_old" AS SELECT * FROM"""
""" (SELECT * FROM "PRODUCT_table") AS table""",
),
],
# custom ALTER TABLE
'custom_alter_table' : [
(
"""ALTER TABLE estimate ADD COLUMN diffcomment text""",
"""ALTER TABLE "PRODUCT_estimate" ADD COLUMN diffcomment text"""
),
(
"""ALTER TABLE estimate ADD COLUMN saveepoch int""",
"""ALTER TABLE "PRODUCT_estimate" ADD COLUMN saveepoch int"""
),
],
#lowercase select (#548)
'lowercase_tokens': [
(
"""select * from ticket""",
"""select * from (SELECT * FROM ticket WHERE product='PRODUCT') AS ticket"""
),
(
"""create temporary table table_old as select * from table""",
"""create temporary table "PRODUCT_table_old" as select * from (SELECT * FROM "PRODUCT_table") AS table""",
)
],
# insert with specified product (#601)
'insert_with_product': [
(
"""INSERT INTO ticket (summary, product) VALUES ('S', 'swlcu')""",
"""INSERT INTO ticket (summary, product) VALUES ('S', 'swlcu')"""
),
],
}
class DbCursorTestCase(unittest.TestCase):
"""Unit tests covering the BloodhoundProductSQLTranslate"""
def setUp(self):
self.translator = BloodhoundProductSQLTranslate(SKIP_TABLES, TRANSLATE_TABLES, PRODUCT_COLUMN, 'PRODUCT')
for section in data.keys():
if not getattr(self, 'test_%s' % section, None):
raise Exception("Section '%s' not covered in test case" % section)
def tearDown(self):
pass
def _run_test(self, section):
for (sql, translated_sql_check) in data[section]:
translated_sql = self.translator.translate(sql)
stripped_sql_check = '\n'.join([l.strip() for l in translated_sql_check.splitlines()])
stripped_translated_sql = '\n'.join([l.strip() for l in translated_sql.splitlines()])
self.assertEquals(stripped_sql_check, stripped_translated_sql)
def test_system_select_nontranslated(self):
self._run_test('system_select_nontranslated')
def test_system_select_translated(self):
self._run_test('system_select_translated')
def test_custom_select(self):
self._run_test('custom_select')
def test_system_insert_nontranslated(self):
self._run_test('system_insert_nontranslated')
def test_system_insert_translated(self):
self._run_test('system_insert_translated')
def test_custom_insert(self):
self._run_test('custom_insert')
def test_system_update_translated(self):
self._run_test('system_update_translated')
def test_system_update_nontranslated(self):
self._run_test('system_update_nontranslated')
def test_custom_update(self):
self._run_test('custom_update')
def test_custom_create_table(self):
self._run_test('custom_create_table')
def test_custom_alter_table(self):
self._run_test('custom_alter_table')
def test_lowercase_tokens(self):
self._run_test('lowercase_tokens')
def test_insert_with_product(self):
self._run_test('insert_with_product')
if __name__ == '__main__':
unittest.main()