github.com/readium/readium-lcp-server@v0.0.0-20240101192032-6e95190e99f1/license/store_test.go (about)

     1  // Copyright 2020 Readium Foundation. All rights reserved.
     2  // Use of this source code is governed by a BSD-style license
     3  // that can be found in the LICENSE file exposed on Github (readium) in the project repository.
     4  
     5  package license
     6  
     7  import (
     8  	"bytes"
     9  	"database/sql"
    10  	"testing"
    11  	"time"
    12  
    13  	_ "github.com/mattn/go-sqlite3"
    14  
    15  	"github.com/readium/readium-lcp-server/config"
    16  	"github.com/readium/readium-lcp-server/sign"
    17  )
    18  
    19  func TestCRUD(t *testing.T) {
    20  
    21  	config.Config.LcpServer.Database = "sqlite3://:memory:"
    22  	driver, cnxn := config.GetDatabase(config.Config.LcpServer.Database)
    23  	db, err := sql.Open(driver, cnxn)
    24  	if err != nil {
    25  		t.Fatal(err)
    26  	}
    27  
    28  	st, err := Open(db)
    29  	if err != nil {
    30  		t.Fatal(err)
    31  	}
    32  
    33  	fn := st.ListAll(10, 0)
    34  	licenses := make([]LicenseReport, 0)
    35  	for it, err := fn(); err == nil; it, err = fn() {
    36  		licenses = append(licenses, it)
    37  	}
    38  	if len(licenses) > 0 {
    39  		t.Errorf("Failed getting an empty list")
    40  	}
    41  
    42  	l := License{}
    43  	contentID := "1234-1234-1234-1234"
    44  	Initialize(contentID, &l)
    45  
    46  	l.User.ID = "me"
    47  	l.Provider = "my.org"
    48  	l.Rights = new(UserRights)
    49  	rstart := time.Now().UTC().Truncate(time.Second)
    50  	l.Rights.Start = &rstart
    51  	rend := rstart.Add(time.Hour * 100)
    52  	l.Rights.End = &rend
    53  	rprint := int32(100)
    54  	l.Rights.Print = &rprint
    55  	rcopy := int32(1000)
    56  	l.Rights.Copy = &rcopy
    57  
    58  	err = st.Add(l)
    59  	if err != nil {
    60  		t.Fatal(err)
    61  	}
    62  
    63  	l2, err := st.Get(l.ID)
    64  	if err != nil {
    65  		t.Fatal(err)
    66  	}
    67  
    68  	js1, err := sign.Canon(l)
    69  	js2, err2 := sign.Canon(l2)
    70  	if err != nil || err2 != nil || !bytes.Equal(js1, js2) {
    71  		t.Error("Difference between Add and Get")
    72  	}
    73  
    74  	// initializes another license with the same data
    75  	Initialize(contentID, &l)
    76  	err = st.Add(l)
    77  	if err != nil {
    78  		t.Fatal(err)
    79  	}
    80  	// and another with a different content id
    81  	contentID2 := "5678-5678-5678-5678"
    82  	Initialize(contentID2, &l)
    83  	err = st.Add(l)
    84  	if err != nil {
    85  		t.Fatal(err)
    86  	}
    87  
    88  	// list all
    89  	fn = st.ListAll(10, 0)
    90  	for it, err := fn(); err == nil; it, err = fn() {
    91  		licenses = append(licenses, it)
    92  	}
    93  	if len(licenses) != 3 {
    94  		t.Errorf("Failed getting three licenses; got %d licenses instead", len(licenses))
    95  	}
    96  
    97  	// list by content id
    98  	licenses = make([]LicenseReport, 0)
    99  	fn = st.ListByContentID(contentID, 10, 0)
   100  	for it, err := fn(); err == nil; it, err = fn() {
   101  		licenses = append(licenses, it)
   102  	}
   103  	if len(licenses) != 2 {
   104  		t.Errorf("Failed getting two licenses by contentID")
   105  	}
   106  
   107  	// update rights
   108  	rstart = time.Now().UTC().Truncate(time.Second)
   109  	l.Rights.Start = &rstart
   110  	rend = rstart.Add(time.Hour * 100)
   111  	l.Rights.End = &rend
   112  	rprint = int32(200)
   113  	l.Rights.Print = &rprint
   114  	rcopy = int32(2000)
   115  	l.Rights.Copy = &rcopy
   116  
   117  	err = st.UpdateRights(l)
   118  	if err != nil {
   119  		t.Fatal(err)
   120  	}
   121  	l2, err = st.Get(l.ID)
   122  	if err != nil {
   123  		t.Fatal(err)
   124  	}
   125  	if *l2.Rights.Print != *l.Rights.Print {
   126  		t.Errorf("Failed getting updated print right")
   127  	}
   128  
   129  	// update
   130  	l.Provider = "him.org"
   131  	err = st.Update(l)
   132  	if err != nil {
   133  		t.Fatal(err)
   134  	}
   135  
   136  	// update the status (revoke)
   137  	err = st.UpdateLsdStatus(l.ID, int32(2))
   138  	if err != nil {
   139  		t.Fatal(err)
   140  	}
   141  
   142  }